Conectivitate Bluetooth cu GameKit

Acest tutorial iOS vă va învăța cum să stabiliți o conexiune Bluetooth între două dispozitive iOS utilizând GKPeerPickerController, GKPeerPickerControllerDelegate, GKSession, și GKSessionDelegate clase. Vom acoperi, de asemenea, modul de trimitere a datelor înainte și înapoi prin conexiune prin crearea unei aplicații simple de mesaje text.


Pasul 1: Configurarea proiectului

Lansați Xcode și faceți clic pe Fișier> Nou> Proiect. Faceți clic pe "Aplicație" sub panoul iOS din stânga. Faceți clic pe pictograma "Vizualizare singură aplicație" și faceți clic pe "Următorul".

În câmpul "Nume produs", tastați "BluetoothTextMessenger" și introduceți un nume pentru identificatorul companiei dvs., cum ar fi "com.mobiletuts". Alegeți "iPhone" din meniul "Device Family". Debifați "Utilizați Storyboards" și "Includeți testele de unitate" și apoi bifați "Utilizați numărarea automată a referințelor." Dați clic pe "Următorul", alegeți o locație pentru a salva proiectul, apoi faceți clic pe "Creați".


Pasul 2: Declarația metodelor

Să începem prin declararea și definirea metodelor de conectare la un dispozitiv și de trimitere a datelor. În fișierul "ViewController.m", adăugați următorul cod:

 @ interfață ViewController () - (void) sendMessage: (id) expeditor; - (void) connectToDevice: (id) expeditor; @end - (void) connectToDevice: (id) expeditor  - (void) sendMessage: (id) expeditor 

Pasul 3: Configurarea interfeței

Să creați două butoane, o etichetă și un câmp text pentru mesageria noastră text. Faceți clic pe fișierul "ViewController.h" și adăugați următorul cod:

 @property (puternic, nonatomic) UILabel * messageReceivedLabel; @property (puternic, nonatomic) UITextField * messageToSendTextField; @property (puternic, nonatomic) sesiune GKSession *; @property (puternic, nonatomic) UIButton * sendButton;

Faceți clic pe fișierul "ViewController.m" și adăugați următorul cod pentru a finaliza proprietățile.

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

În timp ce vă aflați încă în fișierul "ViewController.m", adăugați următorul cod pentru a crea interfața programabil:

 // Buton pentru conectarea la alt dispozitiv UIButton * connectButton = [butonul UIButtonWithType: UIButtonTypeRoundedRect]; connectButton.frame = CGRectMake (20.0f, 20.0f, 80.0f, 40.0f); [connectButton setTitle: @ "Connect" pentruState: UIControlStateNormal]; connectButton.tintColor = [UICoror intunecatGrayColor]; [connectButton addTarget: acțiunea de sine: @selector (connectToDevice :) forControlEvents: UIControlEventTouchUpInside]; [self.view addSubview: connectButton]; // Buton pentru trimiterea mesajului către alt dispozitiv UIButton * sendButton_ = [Butonul UIButtonWithType: UIButtonTypeRoundedRect]; sendButton_.frame = CGRectMake (220.0f, 20.0f, 80.0f, 40.0f); [sendButton_ setTitle: @ "Trimite" pentruState: UIControlStateNormal]; sendButton_.tintColor = [UICoror întunericGrayColor]; sendButton_.enabled = NO; [sendButton_ addTarget: acțiune individuală: @selector (sendMessage :) forControlEvents: UIControlEventTouchUpInside]; self.sendButton = sendButton_; [auto.view addSubview: auto.sendButton]; // Etichetă pentru mesajul primit auto.messageReceivedLabel = nil; Mesajul CGRectReceivedLabel_Frame = CGRectMake (20.0f, 80.0f, 280.0f, 44.0f); UILabel * messageReceivedLabel_ = [[UILabel alocare] initWithFrame: messageReceivedLabel_Frame]; messageReceivedLabel_.textAlignment = UITextAlignmentCenter; messageReceivedLabel_.font = [UIFont boldSystemFontOfSize: 20.0f]; self.messageReceivedLabel = messageReceivedLabel_; [auto.view addSubview: self.messageReceivedLabel]; // Câmp text pentru a introduce mesajul pentru a trimite mesajul CGRectToSendTextField_Frame = CGRectMake (20.0f, 144.0f, 280.0f, 44.0f); UITextField * messageToSendTextField_ = [[Alocare UITextField] initWithFrame: messageToSendTextField_Frame]; messageToSendTextField_.font = [UIFont sistemFontOfSize: 20.0f]; messageToSendTextField_.backgroundColor = [UICcolor whiteColor]; messageToSendTextField_.clearButtonMode = UITextFieldViewModeAlways; messageToSendTextField_.placeholder = @ "Introduceți un mesaj de trimis"; messageToSendTextField_.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; self.messageToSendTextField = messageToSendTextField_; [auto.view addSubview: self.messageToSendTextField];

Cele două butoane inițiază conexiunea și trimit un mesaj text, în timp ce câmpul de text conține mesajul de ieșire, iar eticheta afișează mesajul primit.


Pasul 4: Adăugarea cadrului

GameKit oferă o modalitate ușoară de conectare prin Bluetooth. Utilizarea GKPeerPickerControllerDelegate și GKSessionDelegate, complexitatea conexiunii, cum ar fi ferestrele pentru a arăta conexiunile și cine este în apropiere, sunt întreprinse automat de către delegat. Începeți prin importarea cadrului "GameKit". Faceți clic pe destinația aplicației, fișierul Xcode afișat în partea de sus a panoului stânga din partea stângă. Derulați în jos la panoul "Legături cadru și biblioteci". Faceți clic pe butonul plus și tastați "GameKit". Dați clic pe "GameKit.framework" și apoi faceți clic pe "Adăugați".


Pasul 5: Conform delegațiilor

Faceți clic pe fișierul "ViewController.h" și modificați codul următor pentru a vă conforma GKSessionDelegate și GKPeerPickerControllerDelegate protocoale.

 @ interfață ViewController: UIViewController 

Pasul 6: Adăugarea logicii conexiunii

Cele două clase îndeplinesc fiecare sarcini diferite legate de o conexiune. GKPeerPickerController oferă o interfață pentru a stabili conexiunea dintre două dispozitive, apoi oferă o GKSession obiect ca rezultat al conexiunii. GKSession obiect atunci se ocupă de conexiune și de orice date transmise în funcție de modul în care este configurată aplicația.

Stabilirea unei conexiuni

Să adăugăm logica în ordinea în care apare. În primul rând, vom crea o conexiune folosind GKPeerPickerController. Navigați înapoi la metoda definită anterior connectToDevice: și adăugați următoarea logică în interiorul brațelor pentru a încerca să vă conectați la un dispozitiv când este apăsat butonul de conectare.

 dacă (self.session == zero) // creați colectorul de peer și afișați selectorul de conexiuni GKPeerPickerController * peerPicker = [[GKPeerPickerController alloc] init]; peerPicker.delegate = auto; peerPicker.connectionTypesMask = GKPeerPickerConnectionTypeNearby; [show peerPicker]; 

În codul de mai sus, verificăm să vă asigurați că nu există o sesiune, ceea ce înseamnă că dispozitivul nu este conectat. Dacă nu există sesiune, a GKPeerPickerController este creat și ViewController este desemnat ca delegat pentru ca acesta să poată implementa GKPeerPickerControllerDelegate metode. În cele din urmă, GKPeerPickerController este afișată pe ecran cu o listă a conexiunilor Bluetooth disponibile în apropiere.

Noțiuni de bază GKSession Obiect

Odata ce peerPicker este afișată o serie de metode delegate care se ocupă de conexiune. În timp ce sunteți încă în fișierul "ViewController.m", adăugați următorul cod:

 - (GKessione *) peerPickerController: (GKPeerPickerController *) sesiune de selectareForConnectionType: (GKPeerPickerConnectionType) tip // crea ID pentru sesiunea NSString * sessionIDString = @ "MTBluetoothSessionID"; // crea GKSession obiect GKSession * sesiune = [[GKSession alocare] initWithSessionID: sessionIDString displayName: null sessionMode: GKSessionModePeer]; sesiune de întoarcere; 

Această metodă delegată primește o sesiune bazată pe tipul de conexiune specificat. In aceasta instanta, GKSessionModePeer este folosit pentru că vrem să căutăm dispozitive de conectare ca un client și să promovăm conexiunea ca un server. sesiune ID este necesar pentru a identifica sesiunea și poate fi orice valoare corespunde nevoilor dvs. A revenit GKSession utilizează sesiune ID ca identificator, iar noii colegi pot folosi identificatorul pentru a se conecta la același GKSession.

Respingerea selectorului

Apoi, veți dori să implementați peerPickerController: didConnectPeer: toSession: pentru a prelua controlul asupra sesiunii și a respinge selectorul. Tastați următorul cod în fișierul "ViewController.m".

 - (void) peerPickerController: (GKPeerPickerController *) selectorul didConnectPeer: (NSString *) peerID toSession: (GKSession *) sesiunea // set sesiune delegate și resping selectorul session.delegate = self; auto.session = sesiune; picker.delegate = nil; [refuză selectorul]; 

Delegatul sesiunii este setat la de sine astfel încât ViewController poate implementa GKSessionDelegate metode. Apoi ViewController este eliminat în calitate de delegat al selectorului, iar selectorul este respins deoarece nu mai este necesar.

Seteaza ViewController pentru a primi date

Setați obiectul ViewController pentru a primi date de la colegii săi prin adăugarea următorului cod.

 - (void) sesiune: (GKSession *) sesiune peer: (NSString *) peerID didChangeState: (GKPeerConnectionState) starea if (state == GKPeerStateConnected) [session setDataReceiveHandler: self withContext: nil]; // set ViewController pentru a primi date self.sendButton.enabled = YES; // permite trimiterea butonului atunci când sesiunea este conectată altceva self.sendButton.enabled = NO; // dezactivați butonul de trimitere dacă sesiunea este deconectată self.session.delegate = nil; auto.session = nil; // permite sesiunii să se reconecteze dacă se deconectează

De fiecare dată când se schimbă starea conexiunii, se numește această metodă delegată. În cod, verificăm dacă sesiunea este conectată și, dacă este cazul, ViewController este setat să se ocupe de datele primite de la colegii conectați la sesiune. Dacă sesiunea nu este conectată, delegatul și sesiunea sunt setate la zero, astfel încât să se poată stabili o altă conexiune.

Trimiterea datelor

Pentru a trimite conținutul câmpului de text la dispozitivul conectat, navigați înapoi la metoda definită anterior Trimite mesaj: și adăugați următorul cod în interiorul bretelelor.

 // text câmp text pachet ca NSData obiect NSData * textData = [self.messageToSendTextField.text dataUsingEncoding: NSASCIIStringEncoding]; // trimiteți date către toate dispozitivele conectate [auto.session sendDataToAllPeers: textData withDataMode: GKSendDataReliable error: zero];

Prima linie consolidează textul câmpului de text ca un NSData astfel încât să poată fi trimis prin Bluetooth. A doua linie spune sesiunii să trimită datele tuturor colegilor conectați la sesiune.

Primirea datelor

Datele primite de la un coleg sunt sub forma unui NSData obiect. Pentru a despacheta textul, adăugați următorul cod:

 - (void) receiveData: (NSData *) date dinPeer: (NSString *) peer inSession: (GKSession *) contextul sesiunii: (void *) context // unpackage NSData la NSString și setarea textului primit ca text NSString * receivedString = [NSString alloc] initWithData: codarea datelor: NSASCIIStringEncoding]; self.messageReceivedLabel.text = primitString; 

Prima linie de cod în această metodă despachetează NSData obiect, returnarea unui NSString obiect. În continuare, proprietatea textului etichetei este setată ca șirul de intrare.


Pasul 7: Testarea conexiunii

Conectați un dispozitiv la computer. Clic Produs> Rulați, sau săgeata Run din colțul din stânga sus pentru a construi și a rula aplicația pe un dispozitiv. După ce aplicația rulează pe un dispozitiv, deconectați-l și conectați un al doilea dispozitiv la computer. Construiți și rulați aplicația și pe acest dispozitiv. Lansați aplicația pe ambele dispozitive. Atingeți butonul de conectare de pe ambele dispozitive și urmați instrucțiunile pentru conectarea dispozitivelor. Introduceți un mesaj și atingeți "Trimitere" pentru a vedea că acesta apare pe celălalt dispozitiv.


Concluzie

Un lucru de retinut este ca o conexiune Bluetooth este proiectata pentru trimiterea de biți mici de date, cum ar fi textul sau setul de numere. Dacă intenționați să trimiteți ceva mare ca o fotografie, probabil că doriți să utilizați conexiunea Wi-Fi sau o conexiune la Internet în schimb. În timp ce această aplicație nu vă va lăsa să renunțați la mesagerul dvs. preferat, acesta arată cum să conectați și să trimiteți date de la bibliotecă prin Bluetooth, o caracteristică utilă pentru orice aplicație care ar putea beneficia de partajarea de mici fragmente de date între dispozitive.

Cod