Seit der Veröffentlichung von Apple Watch diskutieren und präsentieren Entwickler Techniken, um die Einschränkungen von watchOS 1 zu überwinden. Entwickler haben sich beispielsweise gefragt, wie sie zuverlässig zwischen einer watchOS-App und ihrer übergeordneten iOS-App kommunizieren können, und umgekehrt.
Es gibt eine Reihe von Lösungen, um dieses Problem zu lösen, z. B. MMWormhole. Natürlich ist sich Apple der Einschränkungen von watchOS 1 bewusst, und mit der Veröffentlichung von watchOS 2 werden einige Einschränkungen von watchOS 1 aufgehoben. Die Kommunikation zwischen einer watchOS 2-App und der übergeordneten iOS-App beispielsweise ist dank der Kommunikation viel einfacher geworden zur Einführung des Watch Connectivity Frameworks.
Das Watch Connectivity-Framework bietet mehrere Möglichkeiten, um zwischen einer iOS- und einer watchOS 2-App zu kommunizieren. Mit dem Watch Connectivity-Framework können Sie Informationen zu einem Gegenstück aktualisieren, Nachrichten senden, Daten im Hintergrund übertragen und sogar Dateien übertragen. Um mehr über alle Funktionen und Funktionen des Frameworks zu erfahren, empfehle ich, die Apple-Dokumentation für das Watch Connectivity-Framework zu durchsuchen.
In diesem Tutorial werde ich Ihnen zeigen, wie Sie Daten zwischen einer watchOS 2-App und der übergeordneten iOS-App austauschen können, und umgekehrt. Die API, die wir dazu verwenden, ist dies sendMessage (_: replyHandler: errorHandler :)
. Mit dieser Methode können Entwickler Daten zwischen der watchOS 2-App und ihrer übergeordneten iOS-App übertragen.
Es ist wichtig zu wissen, dass die iOS- und die watchOS 2-App auf unterschiedliche Weise reagieren sendMessage (_: replyHandler: errorHandler :)
wird aufgerufen. Wenn diese Methode von der watchOS 2-App aufgerufen wird, wird die iOS-App vom Betriebssystem aktiviert. Wenn Sie Daten von der übergeordneten iOS-App an die watchOS 2-App senden, wird diese jedoch nicht aktiviert. Dies ist ein wichtiges Detail, das zu beachten ist.
Da es sich bei diesem Tutorial um die Entwicklung von Apple Watch handelt, gehe ich davon aus, dass Sie mit der Entwicklung von iOS und der Programmiersprache Swift bereits vertraut sind. Das Watch Connectivity-Framework ist nur für watchOS 2 verfügbar. Das bedeutet, dass Sie die neueste Version von Xcode, Xcode 7, installiert haben müssen. Sie können Xcode von der Apple-Entwickler-Website herunterladen.
Öffnen Xcode und wählen Sie Neu> Projekt… von dem Datei Speisekarte. Gehe zu watchOS> Anwendung, wähle aus iOS App mit WatchKit App Projektvorlage und klicken Sie auf Nächster. Benennen Sie Ihre App SendMessageWatch, einstellen Sprache zu Schnell, und Geräte zu iPhone. Deaktivieren Sie das Kontrollkästchen Benachrichtigungsszene einschließen und vergewissern Sie sich, dass jedes Kontrollkästchen unten deaktiviert ist. Schlagen Nächster und wählen Sie einen Ort, um Ihr Projekt zu speichern.
In diesem Schritt fügen wir beiden Apps ein Label und eine Schaltfläche hinzu. Das Label wird verwendet, um die Nachrichten anzuzeigen, die wir senden, während die Schaltfläche die Nachricht an das Gegenstück, die iOS-App oder die watchOS 2-App sendet.
Wir beginnen mit der iOS-App. Öffnen Hauptplatine und fügen Sie eine Beschriftung und eine Schaltfläche hinzu. Erstellen Sie anschließend einen Auslass für beide Elemente der Benutzeroberfläche und fügen Sie eine Aktion für die Schaltfläche hinzu. Der untenstehende Screenshot zeigt das Ergebnis.
Konzentrieren wir uns jetzt auf die watchOS 2-App. Öffnen Interface.storyboard und fügen Sie der Szene ein Label und eine Schaltfläche hinzu. Als nächstes öffnen InterfaceController.swift in dem Schnittassistenz Erstellen Sie einen Auslass für das Label und die Schaltfläche und fügen Sie eine Aktion für die Schaltfläche hinzu.
Wenn die Benutzeroberfläche vorhanden ist, können Sie sich auf das Hauptthema dieses Tutorials konzentrieren und Nachrichten von der iOS-App an die watchOS 2-App senden und umgekehrt.
Die Verwendung des Watch Connectivity Frameworks für den Nachrichtenaustausch erfordert die Verwendung von WCSession
Klasse. Damit dies funktioniert, müssen sowohl die iOS-App als auch die watchOS 2-App eine erstellen und konfigurieren WCSession
Beispiel. Wenn die Sitzung konfiguriert ist, können wir sofort hin und her kommunizieren.
Klasse InterfaceController: WKInterfaceController, WCSessionDelegate var session: WCSession!…
Wir erhalten eine Instanz des WCSession
Klasse durch Aufrufen der defaultSession
Klassenmethode. Dies gibt das Singleton-Session-Objekt für das Gerät zurück. Dann müssen wir den Delegierten der Sitzung festlegen und die Sitzung aktivieren.
Bevor wir das konfigurieren und benutzen WCSession
Objekt, müssen wir überprüfen, dass die WCSession
Klasse wird auf dem Gerät unterstützt. Wir machen das, indem wir das nennen wird unterstützt
Klassenmethode auf der WCSession
Klasse. Wir machen das alles im willActivate
Methode der InterfaceController
Klasse. Beachten Sie, dass enableSession
wird eine Ausnahme auslösen, wenn der Delegat der Sitzung ist Null
. Mit anderen Worten, die Reihenfolge der folgenden Aussagen ist wichtig.
override func willActivate () super.willActivate () if (WCSession.isSupported ()) session = WCSession.defaultSession () session.delegate = selbst session.activateSession ()
Die watchOS 2-App kann jetzt Nachrichten senden und empfangen. Wenn die Sitzung aktiviert ist, müssen wir nur die sendMessage (_: replyHandler: errorHandler :)
Methode zum Senden von Nachrichten. Das erste Argument muss ein typisches Wörterbuch sein [String: AnyObject]
und es sollte nicht sein Null
.
Das replyHandler
ist ein Abschluss, der ein Wörterbuch desselben Typs akzeptiert. Dieses Wörterbuch ist die Antwort des Gegenübers. Das errorHandler
ist auch ein Verschluss, der sein kann Null
Wenn Sie keine Fehler feststellen müssen.
Wenn wir bei der Apple Watch auf die Schaltfläche "Senden" klicken, wird sofort eine Hallo iPhone Nachricht und das iPhone antwortet mit einem Hallo Uhr Botschaft. Nachdem Sie die Senden-Taste auf dem iPhone gedrückt haben, wird eine Frage gesendet Hi watch, kannst du mit mir reden? und die Apple Watch antwortet mit Ja.
Dies ist die Umsetzung der Nachricht senden
Methode sollte wie in aussehen InterfaceController.swift.
@IBAction func sendMessage () let messageToSend = ["Value": "Hallo iPhone"] session.sendMessage (messageToSend, replyHandler: replyMessage in // Handle und präsentiere die Nachricht auf dem Bildschirm let value = replyMessage ["Value"] als String self.messageLabel.setText (value), errorHandler: error in // fangen Sie alle Fehler hier ein print (error))
Um die Nachricht auf dem iOS-Gerät verarbeiten zu können, müssen Sie das implementieren Sitzung (_: didReceiveMessage :)
Delegatmethode des WCSessionDelegate
Protokoll, das aufgerufen wird, wenn eine Nachricht von der Gegenstelle empfangen wird. So sieht die Implementierung aus InterfaceController.schnell.
func session (Sitzung: WCSession, didReceiveMessage Nachricht: [String: AnyObject], ReplyHandler: ([String: AnyObject]) -> Void) // empfangene Nachricht behandeln lassen Wert = Nachricht ["Wert"] als? String // Verwenden Sie diese Option, um sofort auf dem Bildschirm zu erscheinen dispatch_async (dispatch_get_main_queue ()) self.messageLabel.setText (value) // // Senden Sie eine Antwort replyHandler (["Value": "Yes"])
Die Implementierung beider Methoden sieht für die iOS-App sehr ähnlich aus. Versuchen Sie es mit den obigen Implementierungen, indem Sie die Nachricht senden
und session (_: didReceiveMessage: replyHandler :)
Methoden. Dies ist die Umsetzung der ViewController
Klasse sollte aussehen.
UIKit importieren WatchConnectivity-Klasse importieren ViewController: UIViewController, WCSessionDelegate var session: WCSession! @IBOutlet var messageLabel: UILabel! @IBOutlet var sendButton: UIButton! @IBAction func sendMessage (Absender: AnyObject) // Nachricht an WatchKit senden let messageToSend = ["Value": "Hi Uhr, können Sie mit mir sprechen?"] Session.sendMessage (messageToSend, replyHandler: // handleMessage) die Antwort let value = replyMessage ["Value"] as? String // Mit dispatch_asynch sofort auf dem Bildschirm präsentieren dispatch_async (dispatch_get_main_queue ()) self.messageLabel.text = value, errorHandler: Fehler in // fangen alle Fehler auf here print (error)) überschreiben func viewDidLoad () super.viewDidLoad () // Nehmen Sie nach dem Laden der Ansicht weitere Einstellungen vor, normalerweise aus einer Feder. if (WCSession.isSupported ()) session = WCSession.defaultSession () session.delegate = self; session.activateSession () überschreiben func didReceiveMemoryWarning () super.didReceiveMemoryWarning () // Entsorgen Sie alle Ressourcen, die neu erstellt werden können. // Schnelle Funktionssitzung (Sitzung: WCSession, didReceiveMessage-Nachricht: [String: AnyObject], ReplyHandler: ([String: AnyObject]) -> Void) // empfangene Nachricht behandeln lassen Wert = Nachricht ["Wert"] als? String dispatch_async (dispatch_get_main_queue ()) self.messageLabel.text = value // Sende eine Antwort replyHandler (["Value": "Hello Watch"])
Erstellen Sie die Apps, und führen Sie sie aus, um das Endergebnis anzuzeigen. Wenn Sie auf der Apple Watch auf die Schaltfläche tippen, sollte auf dem gekoppelten iPhone, auf dem die iOS-App ausgeführt wird, eine Meldung angezeigt werden. Wenn Sie auf die Schaltfläche der iOS-App tippen, sollte auf der Apple Watch eine Meldung angezeigt werden, auf der die watchOS 2-App ausgeführt wird.
WCSessionDelegate
ProtokollDie Delegatenmethode, die wir implementiert haben, um die Nachricht zu empfangen, ist einfacher, Sitzung (_: didReceiveMessage :)
. Diese Methode wird aufgerufen, wenn sendMessage (_: replyHandler: errorHandler :)
wird ohne Antworthandler aufgerufen. Dies bedeutet lediglich, dass die App, die die Nachricht sendet, keine Antwort erwartet.
Zusätzlich zum Senden eines Wörterbuchs an ein Gegenstück ist es auch möglich, ein NSData
Objekt mit der sendMessageData (_: replyHandler: errorHandler :)
Methode. Das Gegenstück erhält die Nachricht über die Sitzung (_: didReceiveMessageData :)
und session (_: didReceiveMessageData: replyHandler :)
Delegieren von Methoden des WCSessionDelegate
Protokoll.
Wenn Sie sofort mit einem Gegenüber kommunizieren müssen, ist das Watch Connectivity-Framework die beste Wahl für watchOS 2. Die Nachrichten werden in die Warteschlange gestellt und in derselben Reihenfolge zugestellt, in der sie gesendet wurden.
Das Watch Connectivity-Framework bietet weit mehr als das, was in diesem Tutorial behandelt wird. In zukünftigen Tutorials werden wir tiefer in dieses neue Framework eintauchen, um seine Funktionen und Fähigkeiten weiter zu erkunden.