In diesem iOS-Lernprogramm erfahren Sie, wie Sie eine Bluetooth-Verbindung zwischen zwei iOS-Geräten mithilfe von herstellen GKPeerPickerController
, GKPeerPickerControllerDelegate
, GKSession
, und GKSessionDelegate
Klassen. Darüber hinaus erfahren Sie, wie Sie Daten über die Verbindung hin und her senden, indem Sie eine einfache SMS-App erstellen.
Starten Sie Xcode und klicken Sie auf Datei> Neu> Projekt. Klicken Sie links im iOS-Bereich auf "Anwendung". Klicken Sie auf das Symbol "Einzelansicht" und klicken Sie auf "Weiter".
Geben Sie im Feld "Produktname" "BluetoothTextMessenger" ein und geben Sie einen Namen für Ihre Firmenkennung ein, beispielsweise "com.mobiletuts". Wählen Sie "iPhone" aus dem Menü "Gerätefamilie". Deaktivieren Sie "Use Storyboards" und "Unit-Tests einbeziehen", und aktivieren Sie "Automatische Referenzzählung verwenden". Klicken Sie auf "Weiter", wählen Sie einen Speicherort für das Projekt aus und klicken Sie auf "Erstellen".
Beginnen wir mit der Deklaration und Definition der Methoden, um eine Verbindung zu einem Gerät herzustellen und Daten zu senden. Fügen Sie in der Datei "ViewController.m" den folgenden Code hinzu:
@Interface ViewController () - (void) sendMessage: (ID) Absender; - (void) connectToDevice: (id) Absender; @end - (void) connectToDevice: (id) Absender - (void) sendMessage: (id) Absender
Erstellen Sie zwei Schaltflächen, eine Beschriftung und ein Textfeld für unseren Text-Messenger. Klicken Sie auf die Datei "ViewController.h" und fügen Sie den folgenden Code hinzu:
@ property (strong, nonatomic) UILabel * messageReceivedLabel; @ property (strong, nonatomic) UITextField * messageToSendTextField; @ property (strong, nonatomic) GKSession * Sitzung; @ property (strong, nonatomic) UIButton * sendButton;
Klicken Sie auf die Datei "ViewController.m" und fügen Sie den folgenden Code hinzu, um die Eigenschaften abzuschließen.
@ synthetisieren messageReceivedLabel = _messageReceivedLabel; @synthesize messageToSendTextField = _messageToSendTextField; @synthesize session = _session; @synthesize sendButton = _sendButton;
Fügen Sie den folgenden Code hinzu, um die Schnittstelle programmgesteuert zu erstellen, während Sie sich noch in der Datei "ViewController.m" befinden:
// Schaltfläche zum Verbinden mit einem anderen Gerät UIButton * connectButton = [UIButton buttonWithType: UIButtonTypeRoundedRect]; connectButton.frame = CGRectMake (20.0f, 20.0f, 80.0f, 40.0f); [connectButton setTitle: @ "Connect" fürState: UIControlStateNormal]; connectButton.tintColor = [UIColor darkGrayColor]; [connectButton addTarget: Eigenaktion: @selector (connectToDevice :) forControlEvents: UIControlEventTouchUpInside]; [self.view addSubview: connectButton]; // Schaltfläche zum Senden einer Nachricht an ein anderes Gerät UIButton * sendButton_ = [UIButton buttonWithType: UIButtonTypeRoundedRect]; sendButton_.frame = CGRectMake (220.0f, 20.0f, 80.0f, 40.0f); [sendButton_setTitle: @ "Send" fürState: UIControlStateNormal]; sendButton_.tintColor = [UIColor darkGrayColor]; sendButton_.enabled = NEIN; [sendButton_ addTarget: Eigenaktion: @selector (sendMessage :) forControlEvents: UIControlEventTouchUpInside]; self.sendButton = sendButton_; [self.view addSubview: self.sendButton]; // Label für die empfangene Nachricht self.messageReceivedLabel = nil; CGRect messageReceivedLabel_Frame = CGRectMake (20.0f, 80.0f, 280.0f, 44.0f); UILabel * messageReceivedLabel_ = [[UILabel-Zuordnung] initWithFrame: messageReceivedLabel_Frame]; messageReceivedLabel_.textAlignment = UITextAlignmentCenter; messageReceivedLabel_.font = [UIFont boldSystemFontOfSize: 20.0f]; self.messageReceivedLabel = messageReceivedLabel_; [self.view addSubview: self.messageReceivedLabel]; // Textfeld zur Eingabemeldung zum Senden CGRect messageToSendTextField_Frame = CGRectMake (20.0f, 144.0f, 280.0f, 44.0f); UITextField * messageToSendTextField_ = [[UITextField-Zuordnung] initWithFrame: messageToSendTextField_Frame]; messageToSendTextField_.font = [UIFont systemFontOfSize: 20.0f]; messageToSendTextField_.backgroundColor = [UIColor whiteColor]; messageToSendTextField_.clearButtonMode = UITextFieldViewModeAlways; messageToSendTextField_.placeholder = @ "Geben Sie eine zu sendende Nachricht ein"; messageToSendTextField_.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; self.messageToSendTextField = messageToSendTextField_; [self.view addSubview: self.messageToSendTextField];
Die beiden Schaltflächen initiieren die Verbindung und senden eine Textnachricht, während das Textfeld die ausgehende Nachricht enthält und das Etikett die eingehende Nachricht anzeigt.
GameKit bietet eine einfache Möglichkeit, eine Verbindung über Bluetooth herzustellen. Verwenden GKPeerPickerControllerDelegate
und GKSessionDelegate
, Die Feinheiten der Verbindung, z. B. Fenster, um die Verbindungen anzuzeigen und wer in der Nähe ist, werden automatisch vom Delegierten erledigt. Beginnen Sie mit dem Importieren des "GameKit" -Frameworks. Klicken Sie auf das Ziel der App. Die Xcode-Datei wird oben im linken Bereich angezeigt. Blättern Sie nach unten zum Bereich "Verknüpfte Frameworks und Bibliotheken". Klicken Sie auf das Pluszeichen und geben Sie "GameKit" ein. Klicke auf "GameKit.framework" und dann auf "Hinzufügen"..
Klicken Sie auf die Datei "ViewController.h" und bearbeiten Sie den folgenden Code so, dass er dem entspricht GKSessionDelegate
und GKPeerPickerControllerDelegate
Protokolle.
@Interface ViewController: UIViewController
Die zwei Klassen führen jeweils unterschiedliche Aufgaben in Bezug auf eine Verbindung aus. GKPeerPickerController
stellt eine Schnittstelle zum Herstellen der Verbindung zwischen zwei Geräten bereit und stellt dann eine bereit GKSession
Objekt als Ergebnis der Verbindung. Das GKSession
Das Objekt übernimmt dann die Verbindung und alle übergebenen Daten, je nachdem, wie Ihre App konfiguriert ist.
Fügen wir die Logik in der Reihenfolge hinzu, in der sie vorkommt. Zuerst erstellen wir eine Verbindung mit GKPeerPickerController
. Navigieren Sie zurück zur zuvor definierten Methode connectToDevice:
Fügen Sie die folgende Logik in die geschweiften Klammern ein, um eine Verbindung zu einem Gerät herzustellen, wenn Sie auf die Schaltfläche "Verbinden" tippen.
if (self.session == nil) // Peer-Picker und Show-Picker von Verbindungen erstellen GKPeerPickerController * peerPicker = [[GKPeerPickerController-Zuordnung] init]; peerPicker.delegate = self; peerPicker.connectionTypesMask = GKPeerPickerConnectionTypeNearby; [peerPicker show];
Im obigen Code überprüfen wir, ob keine Sitzung vorhanden ist, dh das Gerät ist nicht verbunden. Wenn es keine Sitzung gibt, a GKPeerPickerController
wird erstellt und die ViewController
wird als Delegat zugewiesen, damit er das implementieren kann GKPeerPickerControllerDelegate
Methoden. Zuletzt die GKPeerPickerController
Auf dem Bildschirm wird eine Liste mit verfügbaren Bluetooth-Verbindungen in der Nähe angezeigt.
GKSession
ObjektEinmal die peerPicker
wird eine Reihe von Delegat-Methoden aufgerufen, die die Verbindung handhaben. Fügen Sie den folgenden Code hinzu, während er sich noch in der Datei "ViewController.m" befindet:
- (GKSession *) peerPickerController: (GKPeerPickerController *) Picker sessionForConnectionType: (GKPeerPickerConnectionType) type // ID für Sitzung erstellen NSString * sessionIDString = @ "MTBluetoothSessionID"; // GKSession-Objekt erstellen GKSession * session = [[GKSession-Zuordnung] initWithSessionID: sessionIDString displayName: nil sessionMode: GKSessionModePeer]; Rücksitzung;
Diese Delegatmethode erhält eine Sitzung basierend auf dem angegebenen Verbindungstyp. In diesem Fall, GKSessionModePeer
wird verwendet, weil wir nach Verbindungsgeräten wie einem Client suchen und die Verbindung wie einen Server ankündigen möchten. Das Session-ID
ist notwendig, um die Sitzung zu identifizieren, und kann den Wert haben, der Ihren Bedürfnissen entspricht. Die zurückgekehrt GKSession
verwendet die Session-ID
als Bezeichner, und neue Peers können den Bezeichner verwenden, um eine Verbindung zu diesem herzustellen GKSession
.
Als nächstes möchten Sie implementieren peerPickerController: didConnectPeer: toSession:
um die Kontrolle über die Sitzung zu übernehmen und den Kommissionierer zu entlassen. Geben Sie den folgenden Code in die Datei "ViewController.m" ein.
- (void) peerPickerController: (GKPeerPickerController *) picker didConnectPeer: (NSString *) peerID toSession: (GKSession *) session // set Session Delegate und verwerfen den Picker session.delegate = self; self.session = Sitzung; picker.delegate = null; [picker entlassen];
Der Sitzungsdelegat ist auf festgelegt selbst
so, dass die ViewController
kann das implementieren GKSessionDelegate
Methoden. Dann ist die ViewController
wird als Delegierter des Kommissionierers entfernt und der Kommissionierer wird entlassen, da er nicht mehr benötigt wird.
ViewController
Daten empfangenStellen Sie das ViewController-Objekt so ein, dass es Daten von seinen Peers empfängt, indem Sie den folgenden Code hinzufügen.
- (void) session: (GKSession *) session peer: (NSString *) peerID didChangeState: (GKPeerConnectionState) state if (state == GKPeerStateConnected) [session setDataReceiveHandler: self withContext: nil]; // ViewController so einstellen, dass er Daten empfängt self.sendButton.enabled = YES; // Sendebutton aktivieren, wenn Sitzung verbunden ist else self.sendButton.enabled = NO; // Deaktiviere die Schaltfläche "Senden", wenn die Sitzung getrennt ist self.session.delegate = nil; self.session = null; // Erlaube Sitzung wieder zu verbinden, wenn die Verbindung getrennt wird
Bei jeder Änderung des Verbindungsstatus wird diese Delegatmethode aufgerufen. Im Code überprüfen wir, ob die Sitzung verbunden ist, und wenn dies der Fall ist, ist der ViewController so eingestellt, dass er die Daten verarbeitet, die von mit der Sitzung verbundenen Peers empfangen werden. Wenn die Sitzung nicht verbunden ist, werden Delegat und Sitzung auf Null gesetzt, damit eine andere Verbindung hergestellt werden kann.
Um den Inhalt des Textfelds an das verbundene Gerät zu senden, navigieren Sie zurück zur zuvor definierten Methode Nachricht senden:
und fügen Sie den folgenden Code in die geschweiften Klammern ein.
// Textfeld für Pakettext als NSData-Objekt NSData * textData = [self.messageToSendTextField.text dataUsingEncoding: NSASCIIStringEncoding]; // Daten an alle verbundenen Geräte senden [self.session sendDataToAllPeers: textData withDataMode: GKSendDataReliable error: nil];
Die erste Zeile fasst den Text des Textfelds als ein NSData
Objekt, damit es über Bluetooth gesendet werden kann. Die zweite Zeile weist die Sitzung an, die Daten an alle mit der Sitzung verbundenen Peers zu senden.
Von einem Peer empfangene Daten werden in Form einer NSData
Objekt. Fügen Sie den folgenden Code hinzu, um den Text zu entpacken:
- (void) receiveData: (NSData *) - Daten vonPeer: (NSString *) peer inSession: (GKSession *) Sitzungskontext: (void *) context // entpacken Sie NSData in NSString und setzen Sie den eingehenden Text als Text des Labels NSString *. [NSString-Zuordnung] initWithData: Datenkodierung: NSASCIIStringEncoding]; self.messageReceivedLabel.text = receiveString;
Die erste Codezeile dieser Methode entpackt die NSData
Objekt, ein zurückgeben NSString
Objekt. Als Nächstes wird die Texteigenschaft des Labels als eingehende Zeichenfolge festgelegt.
Schließen Sie ein Gerät an Ihren Computer an. Klicken Produkt> Ausführen, oder den Run-Pfeil in der oberen linken Ecke, um die App auf einem Gerät zu erstellen und auszuführen. Sobald die App auf einem Gerät ausgeführt wird, trennen Sie sie und verbinden Sie ein zweites Gerät mit Ihrem Computer. Erstellen und starten Sie die App auch auf diesem Gerät. Starten Sie die App auf beiden Geräten. Tippen Sie auf die Verbindungstaste auf beiden Geräten und befolgen Sie die Anweisungen, um Ihre Geräte anzuschließen. Geben Sie eine Nachricht ein und tippen Sie auf "Senden", um sie auf dem anderen Gerät anzuzeigen.
Dabei ist zu beachten, dass eine Bluetooth-Verbindung zum Senden von kleinen Datenbits, wie z. B. Text oder Zahlen, vorgesehen ist. Wenn Sie vorhaben, etwas Großes wie ein Foto zu senden, möchten Sie möglicherweise stattdessen WLAN oder eine Internetverbindung verwenden. Bei dieser App werden Sie wahrscheinlich Ihren Lieblingsnachrichtendienst nicht löschen lassen. Sie zeigt jedoch, wie Sie über Bluetooth eine Verbindung herstellen und Datenstücke senden können. Dies ist eine praktische Funktion für jede App, die von der gemeinsamen Nutzung kleiner Datenblöcke profitieren kann.