watchOS 2 Comunicare con una controparte

Fin dal rilascio di Apple Watch, gli sviluppatori hanno discusso e presentato tecniche per superare i limiti di watchOS 1. Gli sviluppatori si sono chiesti, ad esempio, come comunicare in modo affidabile tra un'app watchOS e l'app iOS principale e viceversa.

Un certo numero di soluzioni sono state disponibili per risolvere questo problema, come MMWormhole. Ovviamente Apple è ben consapevole dei limiti di watchOS 1 e il rilascio di watchOS 2 risolve un certo numero di limitazioni di watchOS 1. Comunicare tra un'applicazione watchOS 2 e l'app iOS principale, ad esempio, è diventato molto più semplice grazie all'introduzione del framework Watch Connectivity.

Guarda la connettività

Il framework Watch Connectivity offre diversi modi per comunicare tra un'app iOS e un'app watchOS 2. Con il framework Watch Connectivity, è possibile aggiornare le informazioni su una controparte, inviare messaggi, trasferire dati in background e persino trasferire file. Per ulteriori informazioni su tutte le funzionalità e le funzionalità del framework, ti ​​consiglio di consultare la documentazione di Apple per il framework Watch Connectivity.

In questo tutorial, ti mostrerò come scambiare dati tra un'applicazione watchOS 2 e la sua app madre iOS e viceversa. L'API che useremo per realizzare questo è sendMessage (_: replyHandler: errorHandler :). Questo metodo consente agli sviluppatori di trasferire i dati tra l'app watchOS 2 e l'app iOS principale.

È importante notare che l'app iOS e watchOS 2 rispondono in modo diverso quando sendMessage (_: replyHandler: errorHandler :) è invocato. Se questo metodo viene richiamato dall'app watchOS 2, l'app iOS verrà riattivata dal sistema operativo. Se si inviano dati dall'app per iOS iOS all'app watchOS 2, quest'ultimo non si riattiverà. Questo è un dettaglio importante da tenere a mente.

Prerequisiti

Poiché questo tutorial riguarda lo sviluppo di Apple Watch, presumo che tu abbia già familiarità con lo sviluppo di iOS e il linguaggio di programmazione Swift. Il framework Watch Connectivity è disponibile solo su watchOS 2, il che significa che devi avere l'ultima versione di Xcode installata, Xcode 7. Puoi scaricare Xcode dal sito Web degli sviluppatori di Apple.

1. Impostazione del progetto

Aperto Xcode e selezionare Nuovo> Progetto ...  dal File menu. Vai a watchOS> Applicazione, seleziona il App iOS con l'app WatchKit modello di progetto e fare clic Il prossimo. Dai un nome alla tua app SendMessageWatch, impostato linguaggio a veloce, e dispositivi a i phone. Deseleziona Includi la scena di notifica e assicurati che ogni casella di controllo in basso sia deselezionata. Colpire Il prossimo e scegli una posizione per salvare il tuo progetto.

2. Creazione dell'interfaccia utente

In questo passaggio, aggiungeremo un'etichetta e un pulsante a entrambe le app. L'etichetta verrà utilizzata per visualizzare i messaggi che inviamo mentre il pulsante invierà il messaggio alla controparte, all'app iOS o all'app watchOS 2.

Inizieremo con l'app iOS. Aperto Main.storyboard e aggiungi un'etichetta e un pulsante. Quindi, crea uno sbocco per entrambi gli elementi dell'interfaccia utente e aggiungi un'azione per il pulsante. L'immagine sottostante mostra il risultato.

Concentriamoci ora sull'app watchOS 2. Aperto Interface.storyboard e aggiungi un'etichetta e un pulsante alla scena. Avanti, aperto InterfaceController.swift nel Assistente editore e creare uno sbocco per l'etichetta e il pulsante e aggiungere un'azione per il pulsante.

Con l'interfaccia utente in atto, è ora di ingrandire l'argomento principale di questo tutorial, inviando messaggi dall'app iOS all'app watchOS 2 e viceversa.

3. Utilizzo di Watch Connectivity Framework

L'utilizzo del framework Watch Connectivity per scambiare messaggi richiede l'uso di WCSession classe. Affinché ciò funzioni, sia l'app per iOS che l'app watchOS 2 devono creare e configurare a WCSession esempio. Quando la sessione è configurata, possiamo comunicare immediatamente avanti e indietro.

class InterfaceController: WKInterfaceController, WCSessionDelegate var session: WCSession! ...

Otteniamo un'istanza del WCSession classe chiamando il defaultSession metodo di classe. Ciò restituisce l'oggetto sessione singleton per il dispositivo. Quindi è necessario impostare il delegato della sessione e attivare la sessione.

Prima di configurare e utilizzare il WCSession oggetto, dobbiamo verificare che il WCSession la classe è supportata sul dispositivo. Lo facciamo chiamando il è supportato metodo di classe sul WCSession classe. Facciamo tutto questo nel willActivate metodo del InterfaceController classe. Nota che activateSession genererà un'eccezione se il delegato della sessione è zero. In altre parole, l'ordine delle affermazioni di seguito è importante.

override func willActivate () super.willActivate () if (WCSession.isSupported ()) session = WCSession.defaultSession () session.delegate = self session.activateSession ()

L'app watchOS 2 è ora in grado di inviare e ricevere messaggi. Con la sessione attivata, abbiamo solo bisogno di invocare il sendMessage (_: replyHandler: errorHandler :) metodo per inviare messaggi. Il primo argomento deve essere un dizionario di tipo [String: AnyObject] e non dovrebbe essere zero.

Il replyHandler è una chiusura che accetta un dizionario dello stesso tipo. Questo dizionario è la risposta della controparte. Il errorHandler è anche una chiusura, che può essere zero se non è necessario rilevare errori.

Se clicchiamo il pulsante Invia su Apple Watch, invieremo immediatamente un messaggio Ciao iPhone messaggio e l'iPhone risponderà con a Ciao orologio Messaggio. Dopo aver premuto il pulsante di invio su iPhone, invierà una domanda Ciao orologio, puoi parlarmi? e l'Apple Watch risponderà con .

Questo è ciò che l'implementazione del invia messaggio il metodo dovrebbe apparire come in InterfaceController.swift.

@IBAction func sendMessage () let messageToSend = ["Value": "Hello iPhone"] session.sendMessage (messageToSend, replyHandler: replyMessage in // gestisce e presenta il messaggio sullo schermo lascia value = replyMessage ["Value"] come ? String self.messageLabel.setText (value), errorHandler: errore in // rilevare eventuali errori qui print (errore))

Per gestire il messaggio sul dispositivo iOS, abbiamo bisogno di implementare il sessione (_: didReceiveMessage :) metodo delegato del WCSessionDelegate protocollo, che viene richiamato quando un messaggio viene ricevuto dalla controparte. Ecco come appare l'implementazione InterfaceController.veloce.

func session (session: WCSession, didReceiveMessage message: [String: AnyObject], replyHandler: ([String: AnyObject]) -> Void) // gestisce il messaggio ricevuto let valore = messaggio ["Valore"] come? Stringa // usa questo per presentare immediatamente sullo schermo dispatch_async (dispatch_get_main_queue ()) self.messageLabel.setText (value) // invia una risposta replyHandler (["Value": "Yes"])

L'implementazione di entrambi i metodi sembra molto simile per l'app iOS. Con le implementazioni di cui sopra, provalo implementando il invia messaggio e sessione (_: didReceiveMessage: replyHandler :) metodi. Questo è ciò che l'implementazione del ViewController classe dovrebbe assomigliare.

import UIKit import WatchConnectivity class ViewController: UIViewController, WCSessionDelegate var session: WCSession! @IBOutlet var messageLabel: UILabel! @IBOutlet var sendButton: UIButton! @IBAction func sendMessage (mittente: AnyObject) // Invia messaggio a WatchKit lascia messageToSend = ["Value": "Ciao orologio, puoi parlarmi?"] Session.sendMessage (messageToSend, replyHandler: replyMessage in // handle la risposta let value = replyMessage ["Value"] as? String // usa dispatch_asynch per presentare immediatamente sullo schermo dispatch_async (dispatch_get_main_queue ()) self.messageLabel.text = value, errorHandler: errore in // rilevare eventuali errori qui print (errore)) override func viewDidLoad () super.viewDidLoad () // Esegue un'impostazione aggiuntiva dopo aver caricato la vista, in genere da un pennino. if (WCSession.isSupported ()) session = WCSession.defaultSession () session.delegate = self; session.activateSession () override func didReceiveMemoryWarning () super.didReceiveMemoryWarning () // Elimina le risorse che possono essere ricreate.  // Swift func session (session: WCSession, didReceiveMessage message: [String: AnyObject], replyHandler: ([String: AnyObject]) -> Void) // gestisce il messaggio ricevuto let valore = messaggio ["Valore"] come? String dispatch_async (dispatch_get_main_queue ()) self.messageLabel.text = value // invia una risposta replyHandler (["Value": "Hello Watch"])

Costruisci ed esegui le app per vedere il risultato finale. Quando tocchi il pulsante su Apple Watch, dovrebbe apparire un messaggio sull'iPhone associato che esegue l'app iOS. Quando tocchi il pulsante dell'app iOS, dovrebbe apparire un messaggio su Apple Watch che esegue l'app watchOS 2.

4. Esplorando il WCSessionDelegate Protocollo

Il metodo delegato che abbiamo implementato per ricevere il messaggio ha un fratello più semplice, sessione (_: didReceiveMessage :). Questo metodo è chiamato quando sendMessage (_: replyHandler: errorHandler :) viene invocato senza un gestore di risposta. Ciò indica semplicemente che l'app che invia il messaggio non si aspetta una risposta.

Oltre a inviare un dizionario a una controparte, è anche possibile inviare un NSData oggetto usando il sendMessageData (_: replyHandler: errorHandler :) metodo. La controparte riceve il messaggio attraverso il sessione (_: didReceiveMessageData :) e sessione (_: didReceiveMessageData: replyHandler :) metodi delegati del WCSessionDelegate protocollo.

Conclusione

Se è necessario comunicare immediatamente con una controparte, il framework Watch Connectivity è la scelta migliore su watchOS 2. I messaggi vengono accodati e consegnati nello stesso ordine in cui sono stati inviati.

La struttura di Watch Connectivity ha molto altro da offrire rispetto a quanto descritto in questo tutorial. Nelle future esercitazioni, approfondiremo ulteriormente questo nuovo framework per esplorare ulteriormente le sue funzionalità e capacità.