Bluetooth-tilkobling med GameKit

Denne veiledningen iOS vil lære deg hvordan du etablerer en Bluetooth-forbindelse mellom to iOS-enheter ved hjelp av GKPeerPickerController, GKPeerPickerControllerDelegate, GKSession, og GKSessionDelegate klasser. Vi dekker også hvordan du sender data frem og tilbake gjennom tilkoblingen ved å lage en enkel tekstmeldingsapp.


Trinn 1: Prosjektoppsett

Start Xcode og klikk Fil> Nytt> Prosjekt. Klikk på "Application" under IOS-panelet til venstre. Klikk på "Single View Application" -ikonet og klikk på "Next".

Skriv inn "BluetoothTextMessenger" i feltet "Produktnavn" og skriv inn et navn for firmaidentifikatoren, for eksempel "com.mobiletuts." Velg "iPhone" fra menyen "Enhetsfamilie". Fjern merket for "Bruk Storyboards" og "Include Unit Tests", og merk deretter "Use Automatic Reference Counting." Klikk på "Neste", velg et sted for å lagre prosjektet, og klikk deretter "Create."


Trinn 2: Deklarere metodene

La oss begynne med å erklære og definere metodene for å koble til en enhet og sende data. I filen "ViewController.m" legger du til følgende kode:

 @interface ViewController () - (void) sendMessage: (id) avsender; - (void) connectToDevice: (id) avsender; @end - (void) connectToDevice: (id) avsender  - (tom) sendMessage: (id) avsender 

Trinn 3: Konfigurere grensesnittet

La oss lage to knapper, en etikett og et tekstfelt for tekstmeldingen vår. Klikk på "ViewController.h" -filen og legg til følgende kode:

 @property (strong, nonatomic) UILabel * messageReceivedLabel; @property (strong, nonatomic) UITextField * messageToSendTextField; @property (strong, nonatomic) GKSession * økt; @property (strong, nonatomic) UIButton * sendButton;

Klikk på "ViewController.m" -filen og legg til følgende kode for å fullføre egenskapene.

 @synthesize messageReceivedLabel = _messageReceivedLabel; @synthesize messageToSendTextField = _messageToSendTextField; @synthesize session = _session; @synthesize sendButton = _sendButton;

Mens du fortsatt er i "ViewController.m" -filen, legger du til følgende kode for å opprette grensesnittet programmatisk:

 // Knapp for å koble til annen enhet UIButton * connectButton = [UIButton buttonWithType: UIButtonTypeRoundedRect]; connectButton.frame = CGRectMake (20.0f, 20.0f, 80.0f, 40.0f); [connectButton setTitle: @ "Connect" forState: UIControlStateNormal]; connectButton.tintColor = [UIColor darkGrayColor]; [connectButton addTarget: selvhandling: @selector (connectToDevice :) forControlEvents: UIControlEventTouchUpInside]; [self.view addSubview: connectButton]; // Knapp for å sende melding til annen enhet UIButton * sendButton_ = [UIButton buttonWithType: UIButtonTypeRoundedRect]; sendButton_.frame = CGRectMake (220.0f, 20.0f, 80.0f, 40.0f); [sendButton_ setTitle: @ "Send" forState: UIControlStateNormal]; sendButton_.tintColor = [UIColor darkGrayColor]; sendButton_.enabled = NO; [sendButton_ addTarget: selvhandling: @selector (sendMessage :) forControlEvents: UIControlEventTouchUpInside]; self.sendButton = sendButton_; [self.view addSubview: self.sendButton]; // Etikett for melding som er mottatt self.messageReceivedLabel = nil; CGRect messageReceivedLabel_Frame = CGRectMake (20.0f, 80.0f, 280.0f, 44.0f); UILabel * messageReceivedLabel_ = [[UILabel alloc] initWithFrame: messageReceivedLabel_Frame]; messageReceivedLabel_.textAlignment = UITextAlignmentCenter; messageReceivedLabel_.font = [UIFont boldSystemFontOfSize: 20.0f]; self.messageReceivedLabel = messageReceivedLabel_; [self.view addSubview: self.messageReceivedLabel]; // Tekstfelt for å legge inn meldingen for å sende CGRect messageToSendTextField_Frame = CGRectMake (20.0f, 144.0f, 280.0f, 44.0f); UITextField * messageToSendTextField_ = [[UITextField alloc] initWithFrame: messageToSendTextField_Frame]; messageToSendTextField_.font = [UIFont systemFontOfSize: 20.0f]; messageToSendTextField_.backgroundColor = [UIColor whiteColor]; messageToSendTextField_.clearButtonMode = UITextFieldViewModeAlways; messageToSendTextField_.placeholder = @ "Skriv inn en melding som skal sendes"; messageToSendTextField_.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; self.messageToSendTextField = messageToSendTextField_; [self.view addSubview: self.messageToSendTextField];

De to knappene starter forbindelsen og sender en tekstmelding, mens tekstfeltet holder utgående meldingen, og etiketten viser innkommende melding.


Trinn 4: Legge til rammen

GameKit gir en enkel måte å koble til via Bluetooth. Ved hjelp av GKPeerPickerControllerDelegate og GKSessionDelegate, Forbindelsene, som for eksempel vinduer for å vise tilkoblingene og hvem som er i nærheten, blir tatt vare på av delegaten automatisk. Begynn med å importere "GameKit" -rammen. Klikk på appens mål, Xcode-filen oppført øverst i venstre venstre rute. Rull ned til "Lenkede rammer og biblioteker" -panelet. Klikk på pluss-knappen og skriv inn "GameKit". Klikk "GameKit.framework" og klikk deretter "Legg til".


Trinn 5: I samsvar med delegatene

Klikk på "ViewController.h" filen og rediger følgende kode for å passe til GKSessionDelegate og GKPeerPickerControllerDelegate protokoller.

 @interface ViewController: UIViewController 

Trinn 6: Legge til tilkoblingslogikken

De to klassene utfører ulike oppgaver knyttet til en forbindelse. GKPeerPickerController Gir et grensesnitt for å etablere forbindelsen mellom to enheter, og gir deretter en GKSession objekt som følge av forbindelsen. De GKSession objektet håndterer forbindelsen og eventuelle data som sendes, avhengig av hvordan appen din er konfigurert.

Etablering av en tilkobling

La oss legge til logikken i den rekkefølgen der den forekommer. Først skal vi opprette en tilkobling ved hjelp av GKPeerPickerController. Naviger tilbake til den tidligere definerte metoden connectToDevice: og legg til følgende logikk inne i bøylene for å forsøke å koble til en enhet når tilkoblingsknappen er tappet.

 if (self.session == nil) // opprett peer picker og vise plukkeren av tilkoblinger GKPeerPickerController * peerPicker = [[GKPeerPickerController alloc] init]; peerPicker.delegate = self; peerPicker.connectionTypesMask = GKPeerPickerConnectionTypeNearby; [peerPicker show]; 

I koden ovenfor kontrollerer vi at det ikke er en økt, noe som betyr at enheten ikke er tilkoblet. Hvis det ikke er noen økt, a GKPeerPickerController er opprettet og ViewController er tildelt som delegat slik at den kan implementere GKPeerPickerControllerDelegate metoder. Til slutt, GKPeerPickerController vises på skjermen med en liste over tilgjengelige Bluetooth-tilkoblinger i nærheten.

Komme til GKSession Gjenstand

Først når peerPicker er vist, heter en rekke delegerte metoder som håndterer tilkoblingen. Mens du fortsatt er i "ViewController.m" -filen, legg til følgende kode:

 - (GKSession *) peerPickerController: (GKPeerPickerController *) plukkersessionForConnectionType: (GKPeerPickerConnectionType) type // opprett ID for økt NSString * sessionIDString = @ "MTBluetoothSessionID"; // lage GKSession objekt GKSession * session = [[GKSession allokere] initWithSessionID: sessionIDString displayName: nil sessionMode: GKSessionModePeer]; retur økt; 

Denne delegatemetoden får en økt basert på den angitte tilkoblingstypen. I dette tilfellet, GKSessionModePeer brukes fordi vi vil se etter tilkoblingsenheter som en klient og annonsere forbindelsen som en server. De øktnummer er nødvendig for å identifisere økten og kan være hvilken verdi som passer dine behov. Den returnerte GKSession bruker øktnummer som sin identifikator, og nye jevnaldrende kan bruke identifikatoren til å koble til det samme GKSession.

Avviser Picker

Deretter vil du implementere peerPickerController: didConnectPeer: toSession: for å ta kontroll over sesjonen og avvise plukkeren. Skriv inn følgende kode i filen "ViewController.m".

 - (void) peerPickerController: (GKPeerPickerController *) plukker didConnectPeer: (NSString *) peerID toSession: (GKSession *) økt // set session delegere og avvise plukkeren session.delegate = self; self.session = økt; picker.delegate = nil; [plukkeren avviser] 

Sessionsdelegatet er satt til selv- slik at ViewController kan implementere GKSessionDelegate metoder. Og så ViewController blir fjernet som plukkers delegat, og plukkeren avskediges ettersom den ikke lenger er nødvendig.

Sett ViewController å motta data

Sett ViewController-objektet for å motta data fra sine jevnaldrende ved å legge til følgende kode.

 - (ugyldig) økt: (GKSession *) økt peer: (NSString *) peerID didChangeState: (GKPeerConnectionState) tilstand if (state == GKPeerStateConnected) [økt setDataReceiveHandler: self withContext: null]; // sett ViewController for å motta data self.sendButton.enabled = YES; // aktiver sendknappen når økten er tilkoblet ellers self.sendButton.enabled = NO; // deaktiver send-knappen hvis økten er frakoblet self.session.delegate = nil; self.session = null; // tillate økt å koble til igjen hvis den blir frakoblet

Hver gang forbindelsestilstanden endres, kalles denne delegatemetoden. I koden kontrollerer vi for å se om økten er koblet til, og hvis det er, er ViewController satt til å håndtere data mottatt fra jevnaldrende som er koblet til sesjonen. Hvis økten ikke er tilkoblet, er delegat og økt satt til null slik at en annen forbindelse kan etableres.

Sende data

Hvis du vil sende innholdet i tekstfeltet til enheten som er tilkoblet, navigerer du tilbake til den tidligere definerte metoden sende melding: og legg til følgende kode inne i bøylene.

 // pakke tekstfelt tekst som NSData objekt NSData * textData = [self.messageToSendTextField.text dataUsingEncoding: NSASCIIStringEncoding]; // sende data til alle tilkoblede enheter [self.session sendDataToAllPeers: textData withDataMode: GKSendDataReliable error: null];

Den første linjen pakker opp teksten i tekstfeltet som en NSData objekt slik at den kan sendes via Bluetooth. Den andre linjen forteller at økten skal sende dataene til alle jevnaldrende som er koblet til sesjonen.

Mottar data

Data mottatt fra en peer kommer i form av en NSData gjenstand. For å pakke ut teksten, legg til følgende kode:

 - (void) receiveData: (NSData *) data fraPeer: (NSString *) peer inSession: (GKSession *) økt kontekst: (void *) kontekst // pakke NSData til NSString og angi innkommende tekst som etiketts tekst NSString * receivedString = [ [NSString alloc] initWithData: datakoding: NSASCIIStringEncoding]; self.messageReceivedLabel.text = receivedString; 

Den første linjen med kode i denne metoden pakker ut NSData objekt, retur en NSString gjenstand. Deretter settes tekstegenskapen til etiketten som den innkommende strengen.


Trinn 7: Testing av tilkoblingen

Koble en enhet til datamaskinen. Klikk Produkt> Kjør, eller pilen Kjør øverst til venstre, for å bygge og kjøre appen på en enhet. Når appen kjører på en enhet, koble den fra og koble en annen enhet til datamaskinen. Bygg og kjør appen på denne enheten også. Start appen på begge enhetene. Trykk på tilkoblingsknappen på begge enhetene, og følg instruksjonene for å koble til enhetene dine. Skriv inn en melding og trykk "Send" for å se at den vises på den andre enheten.


Konklusjon

En ting å huske på er at en Bluetooth-tilkobling er designet for å sende små biter av data, for eksempel tekst eller sett med tall. Hvis du planlegger å sende noe stort som et bilde, vil du sannsynligvis bruke Wi-Fi eller en Internett-tilkobling i stedet. Selv om denne appen sannsynligvis ikke vil slippe favoritttekstmeldingen din, viser den hvordan du kobler og sender biter av data via Bluetooth, en praktisk funksjon for alle apper som kan ha nytte av å dele små biter av data mellom enheter.