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.
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".
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
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.
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".
Klik op het bestand "ViewController.h" en bewerk de volgende code om te voldoen aan de GKSessionDelegate
en GKPeerPickerControllerDelegate
protocollen.
@interface ViewController: UIViewController
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.
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.
GKSession
VoorwerpZodra 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
.
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.
ViewController
om gegevens te ontvangenStel 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.
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.
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.
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.
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..