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.
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".
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
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.
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".
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
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.
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.
GKSession
ObiectOdata 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
.
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.
ViewController
pentru a primi dateSetaț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.
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.
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.
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.
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.