Ce didacticiel iOS vous apprendra à établir une connexion Bluetooth entre deux appareils iOS à l'aide de la GKPeerPickerController
, GKPeerPickerControllerDelegate
, GKSession
, et GKSessionDelegate
Des classes. Nous verrons également comment envoyer des données en passant par la connexion en créant une application de messagerie texte simple..
Lancez Xcode et cliquez Fichier> Nouveau> Projet. Cliquez sur "Application" dans le volet iOS à gauche. Cliquez sur l'icône "Single View Application" et cliquez sur "Suivant".
Dans le champ "Nom du produit", tapez "BluetoothTextMessenger" et entrez un nom pour votre identifiant d'entreprise, tel que "com.mobiletuts". Choisissez "iPhone" dans le menu "Famille de périphériques". Décochez les cases "Utiliser les storyboards" et "Inclure les tests unitaires", puis cochez la case "Utiliser le comptage automatique des références". Cliquez sur "Suivant", choisissez un emplacement pour enregistrer votre projet, puis cliquez sur "Créer".
Commençons par déclarer et définir les méthodes pour se connecter à un périphérique et envoyer des données. Dans le fichier "ViewController.m", ajoutez le code suivant:
@interface ViewController () - (void) sendMessage: (id) expéditeur; - (void) connectToDevice: (id) expéditeur; @end - (void) connectToDevice: (id) expéditeur - (void) sendMessage: (id) expéditeur
Créons deux boutons, une étiquette et un champ de texte pour notre messagerie texte. Cliquez sur le fichier "ViewController.h" et ajoutez le code suivant:
@property (strong, nonatomic) UILabel * messageReceivedLabel; @property (strong, nonatomic) UITextField * messageToSendTextField; @property (strong, nonatomic) GKSession * session; @property (strong, nonatomic) UIButton * sendButton;
Cliquez sur le fichier "ViewController.m" et ajoutez le code suivant pour compléter les propriétés..
@synthesize messageReceivedLabel = _messageReceivedLabel; @synthesize messageToSendTextField = _messageToSendTextField; @synthesize session = _session; @synthesize sendButton = _sendButton;
Dans le fichier "ViewController.m", ajoutez le code suivant pour créer l'interface par programme:
// Bouton pour se connecter à un autre périphérique UIButton * connectButton = [UIButton buttonWithType: UIButtonTypeRoundedRect]; connectButton.frame = CGRectMake (20.0f, 20.0f, 80.0f, 40.0f); [connectButton setTitle: @ "Connect" forState: UIControlStateNormal]; connectButton.tintColor = [UIColor darkGrayColor]; [connectButton addTarget: action propre: @selector (connectToDevice :) pourControlEvents: UIControlEventTouchUpInside]; [self.view addSubview: connectButton]; // Bouton pour envoyer un message à un autre périphérique UIButton * sendButton_ = [UIButton buttonWithType: UIButtonTypeRoundedRect]; sendButton_.frame = CGRectMake (220.0f, 20.0f, 80.0f, 40.0f); [sendButton_ setTitle: @ "Send" forState: UIControlStateNormal]; sendButton_.tintColor = [UIColor darkGrayColor]; sendButton_.enabled = NO; [sendButton_ addTarget: auto-action: @selector (sendMessage :) pourControlEvents: UIControlEventTouchUpInside]; self.sendButton = sendButton_; [self.view addSubview: self.sendButton]; // Libellé du message reçu self.messageReceivedLabel = nil; CGRect messageReceivedLabel_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.messageReceivedLabel]; // Champ de texte permettant de saisir le message d'envoi de message CGRectToSendTextField_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 = UITextFieldViewModeAlways; messageToSendTextField_.placeholder = @ "Entrez un message à envoyer"; messageToSendTextField_.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; self.messageToSendTextField = messageToSendTextField_; [self.view addSubview: self.messageToSendTextField];
Les deux boutons établissent la connexion et envoient un message texte, tandis que le champ de texte contient le message sortant et que l'étiquette affiche le message entrant..
GameKit offre un moyen facile de se connecter via Bluetooth. En utilisant GKPeerPickerControllerDelegate
et GKSessionDelegate
, le délégué prend automatiquement en charge les subtilités de la connexion, telles que les fenêtres pour montrer les connexions et les personnes à proximité. Commencez par importer le framework "GameKit". Cliquez sur la cible de l'application, le fichier Xcode répertorié en haut du volet de gauche. Faites défiler la liste jusqu'au volet "Frameworks and Libraries". Cliquez sur le bouton plus et tapez "GameKit". Cliquez sur "GameKit.framework" puis sur "Ajouter".
Cliquez sur le fichier "ViewController.h" et éditez le code suivant pour vous conformer au GKSessionDelegate
et GKPeerPickerControllerDelegate
les protocoles.
@interface ViewController: UIViewController
Les deux classes effectuent chacune des tâches différentes relatives à une connexion. GKPeerPickerController
fournit une interface pour établir la connexion entre deux périphériques, puis fournit une GKSession
objet à la suite de la connexion. le GKSession
objet gère ensuite la connexion et toutes les données transmises en fonction de la configuration de votre application.
Ajoutons la logique dans l'ordre dans lequel elle se produit. Tout d'abord, nous allons créer une connexion en utilisant GKPeerPickerController
. Revenir à la méthode précédemment définie connectToDevice:
et ajoutez la logique suivante à l'intérieur des accolades pour tenter de se connecter à un périphérique lorsque le bouton de connexion est activé.
if (self.session == nil) // crée un sélecteur d'homologue et affiche un sélecteur de connexions GKPeerPickerController * peerPicker = [[GKPeerPickerController alloc] init]; peerPicker.delegate = self; peerPicker.connectionTypesMask = GKPeerPickerConnectionTypeNearby; [peerPicker show];
Dans le code ci-dessus, nous vérifions qu'il n'y a pas de session, ce qui signifie que le périphérique n'est pas connecté. S'il n'y a pas de session, un GKPeerPickerController
est créé et le ViewController
est affecté en tant que délégué afin qu’il puisse mettre en œuvre le GKPeerPickerControllerDelegate
méthodes. Enfin, le GKPeerPickerController
s'affiche à l'écran avec une liste des connexions Bluetooth disponibles à proximité.
GKSession
ObjetUne fois la peerPicker
est montré, une série de méthodes déléguées appelées gèrent la connexion. Dans le fichier "ViewController.m", ajoutez le code suivant:
- (GKSession *) peerPickerController: (GKPeerPickerController *) sélecteur sessionForConnectionType: (GKPeerPickerConnectionType) type // créer l'ID de la session NSString * sessionIDString = @ "MTBluetoothSessionID"; // Créer un objet GKSession GKSession * session = [[GKSession alloc]] initWithSessionID: sessionIDString displayName: nil sessionMode: GKSessionModePeer]; session de retour;
Cette méthode de délégation obtient une session basée sur le type de connexion spécifié. Dans ce cas, GKSessionModePeer
est utilisé parce que nous voulons rechercher des périphériques de connexion comme un client et annoncer la connexion comme un serveur. le ID de session
est nécessaire pour identifier la session et peut être la valeur qui convient à vos besoins. Le rendu GKSession
utilise le ID de session
comme identifiant, et les nouveaux pairs peuvent utiliser cet identifiant pour se connecter au même serveur. GKSession
.
Ensuite, vous aurez envie de mettre en œuvre peerPickerController: didConnectPeer: toSession:
afin de prendre le contrôle de la session et de renvoyer le préparateur. Tapez le code suivant dans le fichier "ViewController.m".
- (void) peerPickerController: (GKPeerPickerController *) sélecteur didConnectPeer: (NSString *) peerID toSession: (GKSession *) session // définir le délégué de session et fermer le sélecteur session.delegate = self; self.session = session; picker.delegate = nil; [sélecteur licencier];
Le délégué de session est défini sur soi
de sorte que la ViewController
peut mettre en œuvre le GKSessionDelegate
méthodes. Puis le ViewController
est retiré en tant que délégué du préparateur, et le sélecteur est rejeté car il n'est plus nécessaire.
ViewController
recevoir des donnéesDéfinissez l'objet ViewController pour recevoir les données de ses pairs en ajoutant le code suivant.
- (void) session: (GKSession *) homologue de session: (NSString *) peerID didChangeState: (GKPeerConnectionState) state if (état == GKPeerStateConnected) [session setDataReceiveHandler: self withContext: nil]; // paramètre ViewController pour recevoir des données self.sendButton.enabled = YES; // active le bouton d'envoi lorsque la session est connectée else self.sendButton.enabled = NO; // désactive le bouton d'envoi si la session est déconnectée self.session.delegate = nil; self.session = nil; // permet à la session de se reconnecter si elle est déconnectée
Chaque fois que l'état de la connexion change, cette méthode de délégation est appelée. Dans le code, nous vérifions si la session est connectée et, si c'est le cas, ViewController est configuré pour gérer les données reçues des homologues connectés à la session. Si la session n'est pas connectée, le délégué et la session sont définis sur nil afin qu'une autre connexion puisse être établie..
Pour envoyer le contenu du champ de texte au périphérique connecté, revenez à la méthode précédemment définie. envoyer le message:
et ajoutez le code suivant entre les accolades.
// package le texte du champ de texte en tant qu'objet NSData NSData * textData = [self.messageToSendTextField.text dataUsingEncoding: NSASCIIStringEncoding]; // envoi de données à tous les périphériques connectés [self.session sendDataToAllPeers: textData withDataMode: GKSendDataReliable error: nil];
La première ligne empaquette le texte du champ de texte en tant que NSData
objet afin qu'il puisse être envoyé via Bluetooth. La deuxième ligne indique à la session d'envoyer les données à tous les pairs connectés à la session..
Les données reçues d'un pair se présentent sous la forme d'un NSData
objet. Pour décompresser le texte, ajoutez le code suivant:
- (void) receiveData: (NSData *) données fromPeer: (NSString *) homologue inSession: (GKSession *) contexte de session: (void *) contexte // décompressez NSData en NSString et définissez le texte entrant comme texte de libellé NSString * createdString = [NSString alloc] initWithData: codage des données: NSASCIIStringEncoding]; self.messageReceivedLabel.text = receiveString;
La première ligne de code de cette méthode décompresse le NSData
objet, retournant un NSString
objet. Ensuite, la propriété textuelle de l'étiquette est définie en tant que chaîne entrante..
Connectez un appareil à votre ordinateur. Cliquez sur Produit> Run, ou la flèche Exécuter dans le coin supérieur gauche pour créer et exécuter l'application sur un appareil. Une fois l'application en cours d'exécution sur un appareil, déconnectez-la et connectez un deuxième appareil à votre ordinateur. Générez et exécutez l'application sur cet appareil également. Lancez l'application sur les deux appareils. Appuyez sur le bouton de connexion sur les deux appareils et suivez les instructions pour connecter vos appareils. Tapez un message et appuyez sur "Envoyer" pour le voir apparaître sur l'autre appareil..
Une chose à garder à l'esprit est qu'une connexion Bluetooth est conçue pour envoyer de petits morceaux de données, tels que du texte ou un ensemble de chiffres. Si vous envisagez d'envoyer quelque chose de grand, comme une photo, vous voudrez probablement utiliser plutôt une connexion Wi-Fi ou Internet. Bien que cette application ne vous laissera probablement pas tomber de votre messagerie texte préférée, elle montre comment connecter et envoyer des bits de données via Bluetooth, une fonctionnalité pratique pour toute application pouvant tirer parti du partage de petits morceaux de données entre appareils..