Depuis la sortie d'Apple Watch, les développeurs ont débattu et présenté des techniques pour surmonter les limites de watchOS 1. Les développeurs se sont demandé, par exemple, comment communiquer de manière fiable entre une application watchOS et son application iOS parente, et inversement..
Un certain nombre de solutions sont disponibles pour résoudre ce problème, telles que MMWormhole. Bien entendu, Apple était bien conscient des limitations de watchOS 1 et la sortie de watchOS 2 résout un certain nombre de limitations de watchOS 1. Par exemple, la communication entre une application watchOS 2 et son application iOS parent est devenue beaucoup plus simple. à l'introduction du framework Watch Connectivity.
L'infrastructure Watch Connectivity offre plusieurs moyens de communiquer entre un iOS et une application watchOS 2. Avec Watch Connectivity Framework, vous pouvez mettre à jour les informations sur une contrepartie, envoyer des messages, transférer des données en arrière-plan et même transférer des fichiers. Pour en savoir plus sur toutes les fonctionnalités et fonctionnalités du cadre, je vous recommande de parcourir la documentation d'Apple sur le cadre Watch Connectivity..
Dans ce tutoriel, je vais vous montrer comment échanger des données entre une application watchOS 2 et son application iOS parente, et inversement. L'API que nous utiliserons pour accomplir ceci est sendMessage (_: replyHandler: errorHandler :)
. Cette méthode permet aux développeurs de transférer des données entre l'application watchOS 2 et son application iOS parente..
Il est important de noter que l’iOS et l’application watchOS 2 répondent différemment lorsque sendMessage (_: replyHandler: errorHandler :)
est invoqué. Si cette méthode est invoquée par l'application watchOS 2, l'application iOS sera réveillée par le système d'exploitation. Si vous envoyez des données de l'application iOS parente à l'application watchOS 2, celle-ci ne se réveillera pas. C'est un détail important à garder à l'esprit.
Étant donné que ce tutoriel concerne le développement Apple Watch, je suppose que vous connaissez déjà le développement iOS et le langage de programmation Swift. Watch Connectivity Framework est uniquement disponible sur watchOS 2, ce qui signifie que vous devez disposer de la dernière version de Xcode, Xcode 7. Vous pouvez télécharger Xcode à partir du site Web du développeur Apple..
Ouvrir Xcode et sélectionnez Nouveau> Projet… du Fichier menu. Aller à watchOS> Application, sélectionnez le Application iOS avec application WatchKit modèle de projet et cliquez Suivant. Nommez votre application SendMessageWatch, ensemble La langue à Rapide, et Dispositifs à iPhone. Décocher Inclure la scène de notification et assurez-vous que toutes les cases en bas sont décochées. Frappé Suivant et choisissez un emplacement pour enregistrer votre projet.
Dans cette étape, nous allons ajouter une étiquette et un bouton aux deux applications. L'étiquette sera utilisée pour afficher les messages que nous envoyons, alors que le bouton enverra le message à la contrepartie, à l'application iOS ou à l'application watchOS 2..
Nous allons commencer avec l'application iOS. Ouvrir Tableau principal et ajoutez une étiquette et un bouton. Créez ensuite une sortie pour les deux éléments de l'interface utilisateur et ajoutez une action pour le bouton. La capture d'écran ci-dessous montre le résultat.
Concentrons-nous maintenant sur l'application watchOS 2. Ouvrir Interface.storyboard et ajoutez une étiquette et un bouton à la scène. Ensuite, ouvrez InterfaceController.swift dans le Assistant rédacteur et créer une sortie pour l'étiquette et le bouton, et ajouter une action pour le bouton.
Avec l'interface utilisateur en place, il est temps de zoomer sur le sujet principal de ce didacticiel, l'envoi de messages depuis l'application iOS vers l'application watchOS 2, et inversement..
L’utilisation de l’infrastructure Watch Connectivity pour l’échange de messages nécessite l’utilisation du WCSession
classe. Pour que cela fonctionne, l’application iOS et l’application watchOS 2 doivent créer et configurer un WCSession
exemple. Lorsque la session est configurée, nous pouvons communiquer immédiatement en arrière.
classe InterfaceController: WKInterfaceController, WCSessionDelegate var session: WCSession!…
Nous obtenons un exemple de WCSession
classe en appelant le defaultSession
méthode de classe. Cela renvoie l'objet de session singleton pour le périphérique. Nous devons ensuite définir le délégué de la session et l'activer..
Avant de configurer et d’utiliser le WCSession
objet, nous devons vérifier que le WCSession
La classe est prise en charge sur le périphérique. Nous faisons cela en appelant le est pris en charge
méthode de classe sur le WCSession
classe. Nous faisons tout cela dans le willActivate
méthode du InterfaceController
classe. Notez que activation de session
jettera une exception si le délégué de la session est néant
. En d'autres termes, l'ordre des déclarations ci-dessous est important.
Remplacer func willActivate () super.willActivate () if (WCSession.isSupported ()) session = WCSession.defaultSession () session.delegate = auto session.activateSession ()
L'application watchOS 2 est maintenant capable d'envoyer et de recevoir des messages. Avec la session activée, il suffit d’appeler le sendMessage (_: replyHandler: errorHandler :)
méthode pour envoyer des messages. Le premier argument doit être un dictionnaire de type [String: AnyObject]
et il ne devrait pas être néant
.
le replyHandler
est une fermeture qui accepte un dictionnaire du même type. Ce dictionnaire est la réponse de la contrepartie. le errorHandler
est aussi une fermeture, qui peut être néant
si vous n'avez pas besoin d'attraper des erreurs.
Si nous appuyons sur le bouton d'envoi de l'Apple Watch, celui-ci enverra immédiatement un message. Bonjour iphone message et l'iPhone répondra avec un Bonjour montre message. Après avoir appuyé sur le bouton d’envoi de l’iPhone, il vous posera une question. Salut montre, peux tu me parler? et l'Apple Watch répondra avec Oui.
C’est ce que la mise en œuvre de la envoyer le message
méthode devrait ressembler à InterfaceController.swift.
@IBAction func sendMessage () let messageToSend = ["Valeur": "Bonjour iPhone"] session.sendMessage (messageToSend, replyHandler: replyMessage in // gère et présente le message à l'écran, laissez value = replyMessage ["Valeur"] ? String self.messageLabel.setText (valeur), errorHandler: erreur dans // enregistre les erreurs ici print (error))
Pour gérer le message sur le périphérique iOS, nous devons implémenter le session (_: didReceiveMessage :)
méthode déléguée du WCSessionDelegate
protocole, qui est appelé lorsqu'un message est reçu par la contrepartie. Voici à quoi ressemble la mise en œuvre dans InterfaceController.rapide.
session func (session: WCSession, message didReceiveMessage: [Chaîne: AnyObject], replyHandler: ([String: AnyObject]) -> Nul) // traiter le message reçu let value = message ["Value"] comme? Chaîne // à utiliser pour afficher immédiatement à l'écran dispatch_async (dispatch_get_main_queue ()) self.messageLabel.setText (value) // envoyer un replyHeader (["Value": "Yes"])
L'implémentation des deux méthodes semble très similaire pour l'application iOS. Avec les implémentations ci-dessus, essayez-le en implémentant le envoyer le message
et session (_: didReceiveMessage: replyHandler :)
méthodes. C’est ce que la mise en œuvre de la ViewController
la classe devrait ressembler.
import UIKit import Classe WatchConnectivity ViewController: UIViewController, WCSessionDelegate var session: WCSession! @IBOutlet var messageLabel: UILabel! @IBOutlet var sendButton: UIButton! @IBAction func sendMessage (expéditeur: AnyObject) // Envoyer un message à WatchKit let messageToSend = ["Valeur": "Bonjour, pouvez-vous me parler?"] Session.sendMessage (messageToSend, replyHandler: replyMessage in // handle la réponse laisse value = replyMessage ["Value"] as? String // utilise dispatch_asynch pour afficher immédiatement à l'écran dispatch_async (dispatch_get_main_queue ()) self.messageLabel.text = valeur, errorHandler: error in // rattrape les erreurs éventuelles here print (error)) override func viewDidLoad () super.viewDidLoad () // Effectue une configuration supplémentaire après le chargement de la vue, généralement à partir d'un nib. if (WCSession.isSupported ()) session = WCSession.defaultSession () session.delegate = self; session.activateSession () écrasera func didReceiveMemoryWarning () super.didReceiveMemoryWarning () // Élimine toutes les ressources pouvant être recréées. // Swift func session (session: WCSession, didReceiveMessage message: [String: AnyObject], replyHandler: ([String: AnyObject]) -> Void) // traiter le message reçu laissez value = message ["Value"] comme? Chaîne dispatch_async (dispatch_get_main_queue ()) self.messageLabel.text = valeur // envoyer un replyHandler (["Value": "Hello Watch"])
Générez et exécutez les applications pour voir le résultat final. Lorsque vous appuyez sur le bouton sur Apple Watch, un message devrait apparaître sur l'iPhone couplé exécutant l'application iOS. Lorsque vous appuyez sur le bouton de l'application iOS, un message devrait apparaître sur Apple Watch, exécutant l'application watchOS 2..
WCSessionDelegate
ProtocoleLa méthode de délégation que nous avons implémentée pour recevoir le message a un frère plus simple, session (_: didReceiveMessage :)
. Cette méthode s'appelle quand sendMessage (_: replyHandler: errorHandler :)
est appelé sans gestionnaire de réponse. Cela indique simplement que l'application qui envoie le message n'attend pas de réponse.
En plus d'envoyer un dictionnaire à un homologue, il est également possible d'envoyer un NSData
objet en utilisant le sendMessageData (_: replyHandler: errorHandler :)
méthode. La contrepartie reçoit le message par le biais du session (_: didReceiveMessageData :)
et session (_: didReceiveMessageData: replyHandler :)
méthodes déléguées du WCSessionDelegate
protocole.
Si vous avez besoin de communiquer immédiatement avec une contrepartie, le framework Watch Connectivity est le meilleur choix pour watchOS 2. Les messages sont mis en file d'attente et livrés dans le même ordre que leur envoi..
Le framework Watch Connectivity a beaucoup plus à offrir que ce qui est couvert dans ce tutoriel. Dans les prochains tutoriels, nous approfondirons ce nouveau cadre pour explorer plus en profondeur ses fonctionnalités et ses capacités..