watchOS 2 Comunicarea cu un contrapartid

Încă de la lansarea Apple Watch, dezvoltatorii au dezbătut și prezentat tehnici pentru a depăși limitările watchOS 1. Dezvoltatorii s-au întrebat, de exemplu, cum să comunice în mod fiabil între o aplicație watchOS și aplicația iOS parentală și invers.

Au fost disponibile numeroase soluții pentru a rezolva această problemă, cum ar fi MMWormhole. Desigur, Apple a fost conștient de limitările watchOS 1 și lansarea watchOS 2 rezolvă o serie de limitări ale watchOS 1. Comunicarea între o aplicație watchOS 2 și aplicația iOS parentală, de exemplu, a devenit mult mai simplă datorită la introducerea cadrului de conectivitate a ceasurilor.

Urmăriți conectivitatea

Cadrul Conectivitate pentru ceas oferă mai multe moduri de comunicare între o aplicație iOS și o aplicație watchOS 2. Cu cadrul de conectivitate pentru ceasuri, puteți să actualizați informații pe o corespondență, să trimiteți mesaje, să transferați date în fundal și chiar să transferați fișiere. Pentru a afla mai multe despre toate caracteristicile și capabilitățile cadrului, vă recomandăm să parcurgeți documentația Apple pentru cadrul Conectivitate ceas.

În acest tutorial, vă voi arăta cum să faceți schimb de date între o aplicație watchOS 2 și aplicația iOS parentală și invers. API-ul pe care îl vom folosi pentru a realiza acest lucru este SendMessage (_: replyHandler: ErrorHandler :). Această metodă permite dezvoltatorilor să transfere date între aplicația watchOS 2 și aplicația iOS parentală.

Este important să rețineți că aplicațiile iOS și watchOS 2 răspund în mod diferit când SendMessage (_: replyHandler: ErrorHandler :) este invocată. Dacă această metodă este invocată de aplicația watchOS 2, aplicația iOS va fi trezită de sistemul de operare. Dacă trimiteți date din aplicația parentală iOS în aplicația watchOS 2, aceasta din urmă nu se va trezi. Acesta este un detaliu important care trebuie păstrat în minte.

Cerințe preliminare

Deoarece acest tutorial este despre dezvoltarea Apple Watch, presupun că deja cunoașteți dezvoltarea iOS și limba de programare Swift. Cadrul Conectivitate pentru ceas este disponibil numai pe watchOS 2, ceea ce înseamnă că trebuie să aveți cea mai recentă versiune a Xcode instalată, Xcode 7. Puteți descărca Xcode de pe site-ul dezvoltatorului Apple.

1. Configurarea proiectului

Deschis Xcode și selectați Nou> Proiect ...  de la Fişier meniul. Mergi la watchOS> Aplicație, selectează aplicația iOS cu aplicația WatchKit șablon de proiect și faceți clic pe Următor →. Denumiți aplicația SendMessageWatch, a stabilit Limba la Rapid, și Dispozitive la iPhone. Debifați Includeți scenariul de notificare și asigurați-vă că fiecare casetă de selectare din partea de jos nu este bifată. Lovit Următor → și alegeți o locație pentru a salva proiectul.

2. Crearea interfeței utilizator

În acest pas, vom adăuga o etichetă și un buton pentru ambele aplicații. Eticheta va fi utilizată pentru a afișa mesajele pe care le trimitem în timp ce butonul va trimite mesajul omologului, aplicația iOS sau aplicația watchOS 2.

Vom începe cu aplicația iOS. Deschis Main.storyboard și adăugați o etichetă și un buton. Apoi, creați o priză pentru ambele elemente ale interfeței utilizator și adăugați o acțiune pentru buton. Imaginea de mai jos afișează rezultatul.

Să ne concentrăm acum pe aplicația watchOS 2. Deschis Interface.storyboard și adăugați o etichetă și un buton la scenă. În continuare, deschideți-vă InterfaceController.swift în Editor asistent și creați o priză pentru etichetă și buton și adăugați o acțiune pentru buton.

Cu interfața cu utilizatorul instalată, este timpul să măriți subiectul principal al acestui tutorial, trimițând mesaje din aplicația iOS în aplicația watchOS 2 și invers.

3. Folosind cadrul de conectivitate pentru ceasuri

Utilizarea cadrului de conectare a ceasului pentru schimbul de mesaje necesită utilizarea funcției WCSession clasă. Pentru ca aceasta să funcționeze, atât aplicația iOS, cât și aplicația watchOS 2 trebuie să creeze și să configureze o WCSession instanță. Când sesiunea este configurată, putem comunica imediat înainte și înapoi.

clasa InterfaceController: WKInterfaceController, WCSessionDelegate var sesiune: WCSession! ...

Obținem o instanță a WCSession clasa prin apelarea defaultSession clasă. Aceasta returnează obiectul de sesiune singleton pentru dispozitiv. Apoi trebuie să setăm delegatul sesiunii și să activăm sesiunea.

Înainte de a configura și a utiliza WCSession obiect, trebuie să verificăm dacă WCSession clasa este acceptată pe dispozitiv. Facem asta prin apelarea isSupported clasă pe WCSession clasă. Facem toate astea în willActivate metodă a InterfaceController clasă. Rețineți că activateSession va arunca o excepție dacă delegația sesiunii este zero. Cu alte cuvinte, ordinea declarațiilor de mai jos este importantă.

suprascrie func willActivate () super.willActivate () dacă (WCSession.isSupported ()) session = WCSession.defaultSession () session.delegate = auto session.activateSession ()

Aplicația watchOS 2 poate trimite și primi mesaje. Cu sesiunea activată, trebuie doar să invocăm SendMessage (_: replyHandler: ErrorHandler :) metoda de trimitere a mesajelor. Primul argument trebuie să fie un dicționar de tip [String: AnyObject] și nu ar trebui să fie zero.

replyHandler este o închidere care acceptă un dicționar de același tip. Acest dicționar este răspunsul omologului. ErrorHandler este, de asemenea, o închidere, care poate fi zero dacă nu este nevoie să prindeți erori.

Dacă apăsăm pe butonul de expediere de pe Apple Watch, acesta va trimite imediat a Bună ziua iPhone mesaj și iPhone va răspunde cu un Bună ziua mesaj. După apăsarea butonului de expediere de pe iPhone, acesta va trimite o întrebare Bună ceas, poți să vorbești cu mine? iar Apple Watch va răspunde cu da.

Aceasta este ceea ce punerea în aplicare a Trimite mesaj metoda ar trebui să arate ca în InterfaceController.swift.

@IBAction func sendMessage () let messageToSend = ["Valoare": "Hello iPhone"] session.sendMessage (messageToSend, replyHandler: replyMessage în // manipulați și prezentați mesajul pe ecran lasă valoarea = replyMessage ["Value" ? String self.messageLabel.setText (valoare), errorHandler: eroare în // prindeți orice eroare aici print (eroare))

Pentru a gestiona mesajul de pe dispozitivul iOS, trebuie să implementăm Sesiunea (_: didReceiveMessage :) metoda delegată a WCSessionDelegate protocol, care este invocat atunci când un mesaj este primit de omologul său. Iată cum arată implementarea InterfaceController.rapid.

funcția sesiune (sesiune: WCSession, mesajul didReceiveMessage: [String: AnyObject], replyHandler: [String: AnyObject]) -> Void) // handle message received let = message [Value] String // foloseste aceasta pentru a prezenta imediat pe ecran dispatch_async (dispatch_get_main_queue ()) self.messageLabel.setText (value) / trimite un răspuns replyHandler (["Value": "Yes"

Implementarea celor două metode pare foarte asemănătoare pentru aplicația iOS. Cu implementările de mai sus, faceți o încercare prin implementarea Trimite mesaj și Sesiunea (_: didReceiveMessage: replyHandler :) metode. Aceasta este ceea ce punerea în aplicare a ViewController clasa ar trebui să arate ca.

import Importul UIKit Clasa WatchConnectivity ViewController: UIViewController, WCSessionDelegate var sesiune: WCSession! @IBOutlet var mesajLabel: UILabel! @IBOutlet var sendButton: UIButton! @IBAction func sendMessage (expeditor: AnyObject) / Trimite mesaj la WatchKit let messageToSend = ["Value": "Hi watch, can you talk to me?"] Session.sendMessage (messageToSend, replyHandler: replyMessage in // handle răspunsul lasă valoarea = replyMessage ["Value"] ca? String // folosiți dispatch_asynch pentru a prezenta imediat pe ecran dispatch_async (dispatch_get_main_queue ()) self.messageLabel.text = value errorHandler: error in // catch any errors aici print (eroare)) override func viewDidLoad () super.viewDidLoad () // Efectuați orice setare suplimentară după încărcarea vizualizării, de obicei de la o pensă. dacă (WCSession.isSupported ()) session = WCSession.defaultSession () session.delegate = auto; session.activateSession () override func didReceiveMemoryWarning () super.didReceiveMemoryWarning () // Distruge orice resurse care pot fi recreate.  // Funcția Swift funcție (sesiune: WCSession, mesaj didReceiveMessage: [String: AnyObject], replyHandler: ([String: AnyObject]) -> Void) // handle message received let = message [Value] String dispatch_async (dispatch_get_main_queue ()) self.messageLabel.text = valoare / trimite un răspuns replyHandler (["Valoare": "Hello Watch"])

Construiți și rulați aplicațiile pentru a vedea rezultatul final. Când atingeți butonul de pe Apple Watch, ar trebui să apară un mesaj pe iPhone asociat care rulează aplicația iOS. Când atingeți butonul aplicației iOS, ar trebui să apară un mesaj pe Apple Watch care rulează aplicația watchOS 2.

4. Explorarea WCSessionDelegate Protocol

Metoda de delegat pe care am implementat-o ​​pentru a primi mesajul are un frate mai simplu, Sesiunea (_: didReceiveMessage :). Această metodă se numește când SendMessage (_: replyHandler: ErrorHandler :) este invocată fără un handler de răspuns. Acest lucru indică pur și simplu că aplicația care trimite mesajul nu așteaptă un răspuns.

În plus față de trimiterea unui dicționar unui omolog, este de asemenea posibil să trimiteți un mesaj NSData obiect folosind sendMessageData (_: replyHandler: ErrorHandler :) metodă. Omologul primește mesajul prin Sesiunea (_: didReceiveMessageData :) și Sesiunea (_: didReceiveMessageData: replyHandler :) să delege metodele WCSessionDelegate protocol.

Concluzie

Dacă aveți nevoie să comunicați imediat cu un omolog, atunci cadrul de conectivitate a ceasului este cea mai bună alegere pentru watchOS 2. Mesajele sunt în coada de așteptare și livrate în aceeași ordine în care au fost trimise.

Cadrul Conectivitate pentru ceas are multe de oferit decât ceea ce este acoperit în acest tutorial. În tutorialele viitoare, ne vom arunca mai adânc în acest nou cadru pentru a explora în continuare caracteristicile și capacitățile sale.

Cod