watchOS 2 Transferuri de fond și cozi

Introducere

Watch Connectivity este un nou cadru de comunicare lansat alaturi de iOS 9 si watchOS 2. Scopul principal este transferul usor si fara intreruperi intre o aplicatie Apple Watch si aplicatia iOS parentala.

Cadrul oferă multe funcționalități diferite. Acum câteva săptămâni, Jorge Costa a scris despre abilitatea de a trimite mesaje între o aplicație iOS și o aplicație Apple Watch. În acest tutorial, vom mări din transferul de date în fundal.

Abilitatea de a trimite mesaje este concepută pentru datele necesare imediat de celălalt dispozitiv. În schimb, transferurile de fundal sunt cele mai potrivite pentru fragmente mai mari de date care nu sunt necesare imediat de contrapartidă. O excepție de la aceasta este cu informații despre complicații, pe care le vom discuta mai târziu în acest tutorial.

Cerințe preliminare

Acest tutorial necesită să executați Xcode 7 pe OS X 10.10 sau o versiune ulterioară. De asemenea, va trebui să descărcați proiectul Starter de la GitHub.

1. Configurarea cadru

Pentru a utiliza cadrul de conectivitate pentru ceas, aplicația iOS și watchOS trebuie să aibă o clasă care să fie conformă cu WCSessionDelegate protocol și care configurează corect setările implicite WCSession. Metodele WCSessionDelegate protocol gestionează primirea tuturor datelor prin cadrul Watch Connectivity și vă permite să preluați controlul asupra noilor date din aplicația dvs..

Deschideți proiectul de pornire în Xcode și editați AppDelegate.swift. În partea de sus, adăugați următoarele import afirmație:

import WatchConnectivity

Apoi, actualizați definiția clasei AppDelegate pentru a face acest lucru în conformitate cu WCSessionDelegate protocol.

clasa AppDelegate: UIResponder, UIApplicationDelegate, WCSessionDelegate 

De asemenea, declarăm o proprietate de tip WCSession! în AppDelegate pentru a stoca o referință la valoarea implicită WCSession obiect.

Var sesiune: WCSession!

În cele din urmă, actualizați aplicare (_: didFinishLaunchingWithOptions :) așa cum se arată mai jos.

(aplicație: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool session = WCSession.defaultSession () session.delegate = auto dacă WCSession.isSupported () session.activateSession ()

În aplicare (_: didFinishLaunchingWithOptions :), avem o referință la valoarea implicită WCSession obiect, setați delegatul sesiunii la aplicațiile dvs. AppDelegate instanță și, dacă este acceptată, activați sesiunea. isSupported vă permite să verificați dacă aplicația watchOS pentru aplicația dvs. iOS este instalată sau nu pe o pereche Apple Watch și este capabilă să trimită date.

Setarea pentru partea watchOS este foarte asemănătoare. Deschis ExtensionDelegate.swift și înlocuiți conținutul cu următoarele:

import WatchKit import WatchConnectivity class ExtensionDelegate: NSObject, WKExtensionDelegate, WCSessionDelegate var sesiune: WCSession! func applicationDidFinishLaunching () session = WCSession.defaultSession () session.delegate = auto session.activateSession () func aplicDidBecomeActive ()  func applicationWillResignActive () 

Veți observa că nu sunăm isSupported pe WCSession înainte de activarea sesiunii. Aceasta se datorează faptului că această metodă se întoarce întotdeauna Adevărat pe partea watchOS.

Pentru a verifica dacă funcționează corect, rulați aplicația Apple Watch pe oricare dintre cele două simulatoare, după cum se arată mai jos.

Apoi, rulați aplicația iOS pe același tip de simulator iPhone pe care l-ați selectat atunci când rulați aplicația pentru ceas.

După lansarea aplicației dvs. iOS, simulatorul Apple Watch ar trebui să se întoarcă la fața ceasului, așa cum se arată în imaginea de mai jos.

2. Trimiterea datelor

Cu implicit WCSession obiect configurat corect, este timpul să trimitem unele date între aplicația iOS și Apple Watch.

Deschis TableViewController.swift și adăugați următoarea linie de cod la sfârșitul createNewItem (_ :) metodă:

WCSession.defaultSession (). TransferUserInfo (element)

 transferUserInfo (_ :) metoda acceptă un dicționar ca singurul său parametru. După ce a fost apelată această metodă, dicționarul de informații despre utilizator pe care l-ați furnizat este adăugat la coada de informații care urmează să fie transferată.

Atât iOS cât și watchOS lucrează împreună pentru a transfera informațiile într-un moment oportun. Sistemul combinat privește lucruri cum ar fi utilizarea aplicațiilor, durata de viață a bateriei, dacă celălalt dispozitiv este utilizat sau nu, etc. Odată ce sistemul a transferat informațiile, aplicația de pe celălalt dispozitiv va executa o metodă de apel invers este lansat.

Acum este momentul pentru noi să implementăm partea de primire pe Apple Watch. Deschis ExtensionDelegate.swift și adăugați următoarea metodă la ExtensionDelegate clasă:

funcția (session: WCSession, didReceiveUserInfo userInfo: [String: AnyObject]) dispatch_async (dispatch_get_main_queue ()) () -> Void in if items = NSUserDefaults.standardUserDefaults [NSDictionary] var newItems = elemente newItems.append (userInfo) NSUserDefaults.standardUserDefaults () setObject (newItems ca AnyObject, pentruKey: "items") else NSUserDefaults.standardUserDefaults : "elemente")

Această metodă va fi apelată de îndată ce vom rula aplicația Apple Watch și odată ce informațiile vor fi transferate cu succes.

Rețineți că în timp ce acest tutorial arată doar un exemplu de transfer de informații de la iOS la watchOS, WCSession și WCSessionDelegate metodele se comportă exact la fel pe ambele platforme pentru transferurile de fond.

Cu acest cod implementat, rulați aplicația Apple Watch în simulator. Apoi rulați din nou aplicația pentru iPhone și apăsați butonul pentru a crea un element nou.

Acum du-te înapoi la simulatorul Apple Watch și apăsați Command-Shift-H de două ori pentru a reveni la cea mai recentă aplicație. Veți vedea că elementul pe care tocmai l-ați creat apare pe Apple Watch.

Rețineți că, în timp ce transferul de informații sa produs imediat între simulatoare, într-o situație reală cu dispozitive fizice, acest lucru nu va fi întotdeauna cazul.

3. Accesarea cozii de transfer în așteptare

În timp ce aplicația dvs. iOS rulează în continuare, părăsiți simulatorul Apple Watch din bara de meniu sau apăsând Command-Q. După aceasta, apăsați butonul din aplicația iOS pentru a crea mai multe elemente, după cum se arată mai jos.

Ori de câte ori încercați să transferați informații utilizând cadrul de conectivitate pentru ceas, acesta este adăugat la o coadă care este eliminată treptat, pe măsură ce informațiile sunt transferate. Această coadă poate fi accesată și pot fi accesate și transferurile din coadă.

Acest lucru este util, deoarece puteți vedea câte elemente sunt în așteptare și puteți chiar să anulați anumite transferuri dacă este necesar. Elementele pe care tocmai le-ați creat sunt în prezent ținute în coada de informații a utilizatorului, deoarece Apple Watch este în prezent deconectat de la dispozitivul părinte, ceea ce face imposibil un transfer.

Deschis AppDelegate.swift și adăugați următorul cod la sfârșitul lui aplicare (_: didFinishLaunchingWithOptions :):

permiteți transferurile = session.outstandingUserInfoTransfers dacă transfer.count> 0 let transfer = transfers.first! transfer.cancel ()

Cu acest cod, accesăm transferurile extraordinare de informații despre utilizatori și, dacă există cel puțin unul, anulează primul transfer. WCSessionUserInfoTransfer obiecte returnate de la outstandingUserInfoTransfers Proprietatea are de asemenea două proprietăți read-only pe care le puteți accesa:

  • userinfo: Această proprietate stochează dicționarul pe care îl transferați.
  • transferare: Această proprietate stochează o valoare booleană și indică dacă informațiile despre utilizator sunt în prezent transferate.

Nu există prea multe funcționalități disponibile cu transferuri remarcabile de informații în cadrul Watch Connectivity, dar, în funcție de aplicația dvs., unele dintre aceste caracteristici ar putea fi foarte utile.

4. Alte metode de transfer

În acest tutorial, am acoperit numai transferurile de informații de bază ale utilizatorilor, dar există și alte câteva modalități de transfer de date între dispozitive. Fiecare dintre aceste metode sunt concepute pentru un anumit scop atunci când comunică între iPhone și Apple Watch.

Contextul aplicației

Aici trebuie să transferați informații între dispozitivele în care sunt relevante numai cele mai recente informații. Transferați un singur dicționar prin apelarea updateApplicationContext (_: eroare :) metodă. eroare parametru în această metodă este un pointer la un NSError obiect, care va fi completat cu informații dacă apare o problemă la transfer.

Pe partea de primire puteți implementa Sesiunea (_: didReceiveApplicationContext :) sau, alternativ, accesați contextul aplicației prin implicit WCSession obiecte receivedApplicationContext proprietate.

Informații despre complicații

Aici trebuie să transferați un singur dicționar de informații pentru utilizatori, în special pentru complicațiile personalizate ale aplicației dvs. Puteți trimite numai informații din partea iOS și acest lucru se face cu transferCurrentComplicationUserInfo (_ :) metodă.

Diferența esențială dintre acest lucru și transferUserInfo (_ :) metoda utilizată anterior în acest tutorial este că, atunci când se actualizează o complicație, sistemul va încerca întotdeauna să transfere informațiile imediat.

Rețineți că un transfer nu este garantat, deoarece dispozitivele pot fi deconectate sau complicația dvs. poate să fi depășit bugetul de execuție de fond. Dacă nu se poate completa un transfer de informații despre complicații, acesta se adaugă la outstandingUserInfoTransfers coada unde poate fi vizualizată și anulată dacă este necesar.

De asemenea, rețineți că, dacă un transfer de informații despre complicații se află în coada de așteptare și îl apelați transferCurrentComplicationUserInfo (_ :) din nou, transferul existent în coadă va fi invalidat și anulat.

Fișiere

Puteți chiar utiliza cadrul de conectare a ceasului pentru a transfera fișiere între dispozitive. Acest lucru se face prin transferFile (_: Metadata :) unde primul parametru este local NSURL la fișier, iar al doilea este un dicționar opțional, care conține orice date suplimentare asociate acelui fișier.

Așa cum v-ați aștepta, primirea acestui fișier este tratată printr-o metodă a WCSessionDelegate protocol, Sesiunea (_: didReceiveFile :) pentru a fi precis. În această metodă, vi se dă un singur WCSessionFile obiect care conține o nouă adresă locală URL la fișierul real, precum și metadatele pe care le-ați transferat.

Ca și în cazul transferurilor de informații despre utilizatori, puteți vizualiza, de asemenea, transferurile în așteptare sau transferurile de fișiere care sunt în desfășurare prin implicit WCSession obiecte outstandingFileTransfers proprietate.

Concluzie

În general, cadrul de conectivitate a ceasului oferă o interfață foarte simplă și ușor de utilizat pentru a transfera date între un iPhone conectat și un ceas Apple. Cadrul permite transferul de informații despre utilizatori, contextul aplicației și dicționarele despre complicații, precum și fișierele.

Acum ar trebui să vă simțiți confortabil atât cu privire la trimiterea și primirea informațiilor utilizând cadrul de conectivitate pentru ceas, cât și prin modul în care puteți interacționa cu orice transferuri restante.

Ca întotdeauna, vă rugăm să aveți grijă să lăsați comentariile și comentariile dvs. în comentariile de mai jos.

Cod