Bluetooth-connectiviteit met GameKit

Deze iOS-zelfstudie leert je hoe je een Bluetooth-verbinding tot stand kunt brengen tussen twee iOS-apparaten die de GKPeerPickerController, GKPeerPickerControllerDelegate, GKSession, en GKSessionDelegate klassen. We bespreken ook hoe u gegevens heen en weer kunt sturen via de verbinding door een eenvoudige sms-app te maken.


Stap 1: Projectinstellingen

Start Xcode en klik Bestand> Nieuw> Project. Klik op "Toepassing" onder het iOS-paneel aan de linkerkant. Klik op het pictogram "Single View Application" en klik op "Volgende".

Typ 'BluetoothTextMessenger' in het veld 'Productnaam' en voer een naam in voor uw bedrijfsidentificatie, zoals 'com.mobiletuts'. Kies 'iPhone' in het menu 'Apparaatfamilie'. Verwijder het vinkje bij 'Storyboards gebruiken' en 'Inclusief unittests' en vink vervolgens 'Gebruik automatische referentietelling' aan. Klik op "Volgende", kies een locatie om uw project op te slaan en klik vervolgens op "Maken".


Stap 2: De methoden declareren

Laten we beginnen met het declareren en definiëren van de methoden om verbinding te maken met een apparaat en gegevens te verzenden. Voeg in het bestand "ViewController.m" de volgende code toe:

 @interface ViewController () - (void) sendMessage: (id) afzender; - (void) connectToDevice: (id) afzender; @end - (void) connectToDevice: (id) afzender  - (ongeldig) sendMessage: (id) afzender 

Stap 3: De interface instellen

Laten we twee knoppen, een label en een tekstveld maken voor onze tekstboodschapper. Klik op het bestand "ViewController.h" en voeg de volgende code toe:

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

Klik op het bestand "ViewController.m" en voeg de volgende code toe om de eigenschappen te voltooien.

 @synthesize messageReceivedLabel = _messageReivedLabel; @synthetize messageToSendTextField = _messageToSendTextField; @synthesize session = _session; @synthetize sendButton = _sendButton;

Voeg, nog steeds binnen het bestand "ViewController.m", de volgende code toe om de interface programmatisch te maken:

 // Knop om verbinding te maken met ander apparaat UIButton * connectButton = [UIButton-knopWithType: UIButtonTypeRoundedRect]; connectButton.frame = CGRectMake (20.0f, 20.0f, 80.0f, 40.0f); [connectButton setTitle: @ "Connect" forState: UIControlStateNormal]; connectButton.tintColor = [UIColor darkGrayColor]; [connectButton addTarget: self action: @selector (connectToDevice :) forControlEvents: UIControlEventTouchUpInside]; [self.view addSubview: connectButton]; // Knop om een ​​bericht naar een ander apparaat te verzenden UIButton * sendButton_ = [knop UIButtonWithType: UIButtonTypeRoundedRect]; sendButton_.frame = CGRectMake (220.0f, 20.0f, 80.0f, 40.0f); [sendButton_ setTitle: @ "Send" forState: UIControlStateNormal]; sendButton_.tintColor = [UIColor darkGrayColor]; sendButton_enabled = NEE; [sendButton_ addTarget: self action: @selector (sendMessage :) forControlEvents: UIControlEventTouchUpInside]; self.sendButton = sendButton_; [self.view addSubview: self.sendButton]; // Label voor bericht dat is ontvangen self.messageReceivedLabel = nil; CGRect-berichtReceivedLabel_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.messageReivedLabel]; // Tekstveld om bericht in te voeren om CGRect bericht te verzendenToSendTextField_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 = UITextFieldViewMode Always; messageToSendTextField_.placeholder = @ "Voer een bericht in om te verzenden"; messageToSendTextField_.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; self.messageToSendTextField = messageToSendTextField_; [self.view addSubview: self.messageToSendTextField];

De twee knoppen starten de verbinding op en verzenden een SMS-bericht, terwijl het tekstveld het uitgaande bericht bevat en het label het binnenkomende bericht weergeeft.


Stap 4: Het framework toevoegen

GameKit biedt een eenvoudige manier om verbinding te maken via Bluetooth. Gebruik makend van GKPeerPickerControllerDelegate en GKSessionDelegate, de fijne kneepjes van de verbinding, zoals vensters om de verbindingen te tonen en wie er in de buurt is, worden automatisch door de afgevaardigde verzorgd. Begin met het importeren van het "GameKit" -raamwerk. Klik op het doel van de app, het Xcode-bestand bovenaan het uiterst links paneel. Blader omlaag naar het deelvenster "Gekoppelde kaders en bibliotheken". Klik op de plusknop en typ 'GameKit'. Klik op "GameKit.framework" en klik vervolgens op "Toevoegen".


Stap 5: Conformeren aan de afgevaardigden

Klik op het bestand "ViewController.h" en bewerk de volgende code om te voldoen aan de GKSessionDelegate en GKPeerPickerControllerDelegate protocollen.

 @interface ViewController: UIViewController 

Stap 6: De verbindingslogica toevoegen

De twee klassen voeren elk verschillende taken met betrekking tot een verbinding uit. GKPeerPickerController biedt een interface om de verbinding tussen twee apparaten tot stand te brengen, en biedt vervolgens een GKSession object als het resultaat van de verbinding. De GKSession Object behandelt vervolgens de verbinding en alle gegevens die worden doorgegeven, afhankelijk van hoe uw app is geconfigureerd.

Een verbinding tot stand brengen

Laten we de logica toevoegen in de volgorde waarin deze voorkomt. Eerst maken we een verbinding met behulp van GKPeerPickerController. Navigeer terug naar de eerder gedefinieerde methode connectToDevice: en voeg de volgende logica toe aan de accolades om te proberen verbinding te maken met een apparaat wanneer op de verbindingsknop wordt getikt.

 if (self.session == nil) // create peer picker and show picker of connections GKPeerPickerController * peerPicker = [[GKPeerPickerController alloc] init]; peerPicker.delegate = zelf; peerPicker.connectionTypesMask = GKPeerPickerConnectionTypeNearby; [peerPicker-show]; 

In de bovenstaande code controleren we of er geen sessie is, wat betekent dat het apparaat niet is verbonden. Als er geen sessie is, GKPeerPickerController is gemaakt en de ViewController wordt toegewezen als de gedelegeerde zodat deze de GKPeerPickerControllerDelegate methoden. Ten slotte, de GKPeerPickerController wordt op het scherm weergegeven met een lijst met beschikbare Bluetooth-verbindingen in de buurt.

De GKSession Voorwerp

Zodra de peerPicker wordt getoond, wordt een reeks gedelegeerde methoden genoemd die de verbinding afhandelen. Voeg, terwijl je nog steeds in het bestand "ViewController.m" zit, de volgende code toe:

 - (GKSession *) peerPickerController: (GKPeerPickerController *) pickersessieForConnectionType: (GKPeerCommunicectionType) type // create ID for session NSString * sessionIDString = @ "MTBluetoothSessionID"; // create GKSession-object GKSession * session = [[GKSession-allocatie] initWithSessionID: sessionIDString displayName: nil sessionMode: GKSessionModePeer]; terugkomst sessie; 

Deze gedelegeerde methode krijgt een sessie op basis van het opgegeven verbindingstype. Op dit moment, GKSessionModePeer wordt gebruikt omdat we naar verbindingsapparaten zoals een klant willen zoeken en de verbinding willen adverteren als een server. De sessionID is nodig om de sessie te identificeren en kan van elke waarde zijn die past bij uw behoeften. De teruggekeerden GKSession gebruikt de sessionID als de identifier en nieuwe peers kunnen de identifier gebruiken om verbinding te maken met dezelfde GKSession.

De plukker sluiten

Vervolgens wilt u implementeren peerPickerController: didConnectPeer: toSession: om de controle over de sessie te nemen en de picker te verwerpen. Typ de volgende code in het bestand "ViewController.m".

 - (void) peerPickerController: (GKPeerPickerController *) picker didConnectPeer: (NSString *) peerID toSession: (GKSession *) sessie // set sessie delegeren en de kiezer session.delegate = self sluiten; self.session = sessie; picker.delegate = nul; [picker negeren]; 

De sessiedelegator is ingesteld op zelf zodat de ViewController kan het GKSessionDelegate methoden. Dan de ViewController wordt verwijderd als de afgevaardigde van de kiezer en de kiezer wordt afgewezen omdat deze niet langer nodig is.

Stel de ViewController om gegevens te ontvangen

Stel het ViewController-object in om gegevens van zijn peers te ontvangen door de volgende code toe te voegen.

 - (ongeldig) sessie: (GKSession *) sessie peer: (NSString *) peerID didChangeState: (GKPeerConnectionState) state if (state == GKPeerStateConnected) [session setDataReceiveHandler: self withContext: nil]; // stel ViewController in om gegevens te ontvangen self.sendButton.enabled = YES; // schakel knop in wanneer sessie is verbonden else self.sendButton.enabled = NO; // schakel verzendknop uit als sessie wordt verbroken self.session.delegate = nil; self.session = nihil; // sessie toestaan ​​opnieuw verbinding te maken als het verbinding verliest

Telkens wanneer de verbindingsstatus verandert, wordt deze gedelegeerde methode aangeroepen. In de code controleren we of de sessie is verbonden en, als dat het geval is, de ViewController is ingesteld om de gegevens te verwerken die zijn ontvangen van peers die zijn verbonden met de sessie. Als de sessie niet is verbonden, worden de deelnemer en de sessie op nul gezet zodat er een nieuwe verbinding tot stand kan worden gebracht.

Gegevens verzenden

Als u de inhoud van het tekstveld naar het apparaat wilt verzenden dat is verbonden, navigeert u terug naar de eerder gedefinieerde methode bericht versturen: en voeg de volgende code toe aan de accolades.

 // pakket tekstveld tekst als NSData object NSData * textData = [self.messageToSendTextField.text dataUsingEncoding: NSASCIIStringEncoding]; // gegevens verzenden naar alle verbonden apparaten [self.session sendDataToAllPeers: textData withDataMode: GKSendDataReliable error: nil];

De eerste regel verpakt de tekst van het tekstveld als een NSData object zodat het via Bluetooth kan worden verzonden. De tweede regel vertelt de sessie om de gegevens te verzenden naar alle peers die met de sessie zijn verbonden.

Data ontvangen

Gegevens ontvangen van een peer komt in de vorm van een NSData voorwerp. Voer de volgende code in om de tekst uit te pakken:

 - (ongeldig) receiveData: (NSData *) data fromPeer: (NSString *) peer inSession: (GKSession *) sessiecontext: (void *) context // unpackage NSData naar NSString en stel inkomende tekst in als labeltekst NSString * receivedString = [ [NSString-toewijzing] initWithData: gegevenscodering: NSASCIIStringEncoding]; self.messageReceivedLabel.text = receivedString; 

De eerste regel code in deze methode pakt de NSData object, retourneren van een NSString voorwerp. Vervolgens wordt de teksteigenschap van het label ingesteld als de inkomende reeks.


Stap 7: De verbinding testen

Sluit een apparaat op uw computer aan. Klik Product> Run, of de pijl Uitvoeren in de linkerbovenhoek om de app op een apparaat te bouwen en uit te voeren. Zodra de app op een apparaat wordt uitgevoerd, koppelt u deze los en sluit u een tweede apparaat op uw computer aan. Bouw en run de app ook op dit apparaat. Start de app op beide apparaten. Tik op de verbindingsknop op beide apparaten en volg de aanwijzingen om uw apparaten te verbinden. Typ een bericht en tik op "Verzenden" om het op het andere apparaat te zien verschijnen.


Conclusie

Een ding om in gedachten te houden is dat een Bluetooth-verbinding is ontworpen voor het verzenden van kleine stukjes gegevens, zoals tekst of een reeks cijfers. Als u van plan bent iets groots als een foto te verzenden, wilt u waarschijnlijk liever wifi of een internetverbinding gebruiken. Hoewel je met deze app waarschijnlijk je favoriete tekstboodschap niet laat vallen, wordt wel weergegeven hoe je gegevens via Bluetooth kunt verbinden en verzenden, een handige functie voor elke app die kan profiteren van het delen van kleine hoeveelheden gegevens tussen apparaten..