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.
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."
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
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.
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".
Klikk på "ViewController.h" filen og rediger følgende kode for å passe til GKSessionDelegate
og GKPeerPickerControllerDelegate
protokoller.
@interface ViewController: UIViewController
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.
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.
GKSession
GjenstandFø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
.
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.
ViewController
å motta dataSett 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.
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.
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.
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.
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.