Ce este nou în watchOS 3 Sarcini de fundal

Introducere

Cu actualizarea viitoare a watchOS 3 pentru toate dispozitivele Apple Watch, performanța multor aplicații de vizionare se va îmbunătăți semnificativ. Acest lucru se datorează în principal noilor forme de execuție a fundalului pe care aplicațiile watchOS le pot profita pentru a-și reîmprospăta periodic conținutul și au întotdeauna cele mai recente informații gata de vizualizare de către utilizator.

În acest tutorial vă voi arăta cum puteți utiliza noile API-uri WatchKit în watchOS 3 pentru ca propria aplicație să utilizeze aceste noi sarcini de fundal. Este important să rețineți că, chiar dacă aplicația dvs. este configurată corespunzător pentru a susține actualizările de fundal, în funcție de configurația unui anumit utilizator, este posibil ca sistemul să nu permită executarea aplicației în fundal.

Acest tutorial necesită executarea Xcode 8 pe OS X El Capitan sau mai târziu.

1. Sarcini de bază

Prima clasă nouă importantă în watchOS 3 este WKRefreshBackgroundTask clasă. Aceasta este o clasă abstractă pe care nu ar trebui să o subclasați sau să creați instanțe ale dvs. înșivă. Definește doar o singură proprietate, userinfo, care poate stoca informații suplimentare referitoare la sarcina de fundal. De asemenea, definește o singură metodă, setTaskCompleted (), pe care trebuie să-l numiți pentru a spune sistemului că sarcina este completă. Dacă nu apelați acest lucru, atunci sistemul va petrece perioada maximă de timp înscrisă în aplicația dvs. încercând să finalizeze sarcina, ceea ce, la rândul său, irosește bateria și dăunează performanțelor altor aplicații.

Când aplicația dvs. ar trebui să se ocupe de o sarcină de fundal finalizată, sistemul va apela delegatul dvs. de extensie watchOS mâner(_:) metodă. Parametrul unic al acestei metode este un set de WKRefreshBackgroundTask obiecte pe care trebuie să le treceți și să le procesați în consecință. 

În cadrul WatchKit, Apple furnizează următoarele patru subclase concrete; watchOS va transmite extensiei dvs. delega o instanță a clasei corespunzătoare în funcție de sarcină.

  • WKApplicationRefreshBackgroundTask este un tip general de sarcină de bază care nu este specializat pentru un anumit tip de refresh. Cea mai obișnuită situație de utilizare pentru acest tip este pentru programarea altor sarcini. De exemplu, ați putea programa o reîmprospătare a fundalului pentru aplicația dvs. într-un anumit moment al zilei în fiecare zi. Când se potrivește WKApplicationRefreshBackgroundTask obiectul este apoi trecut în delegatul dvs. de extindere mâner(_:) , puteți crea o sarcină de rețea de fundal pentru a descărca anumite date pentru a reîmprospăta conținutul aplicației.
  • WKSnapshotRefreshBackgroundTask este un tip de sarcină specific pentru momentul în care aplicația trebuie să își actualizeze instantaneul. Vom discuta instantaneu mai târziu în acest tutorial. Tot ce trebuie să știți pentru moment este că imaginea unei aplicații este folosită ca imagine de lansare și poate fi afișată și în docul utilizatorului (accesibil prin apăsarea butonului lateral). Rețineți că acest tip de sarcină de fundal are o metodă unică de completare a sarcinilor pe care o vom discuta mai târziu.
  • WKWatchConnectivityRefreshBackgroundTask este un tip de sarcină atunci când ați transferat date de pe iPhone pe ceas prin cadrul WatchConnectivity. Deoarece acest cadru oferă o metodă de transferare a datelor de complicații direct în ceas, acest tip de sarcină de bază corespunzător este folosit în principal pentru a programa actualizările instantaneului ca răspuns la datele primite de la iPhone.
  • WKURLSessionRefreshBackgroundTask este un tip de activitate atribuit delegației dvs. de extensie atunci când o activitate de rețea de fundal a fost finalizată. În acest scenariu, metodele delegate pe care le-ați configurat pentru URLSession obiect este încă numit, și este aici în cazul în care aveți nevoie pentru a lucra cu datele în mod corespunzător. mâner(_:) metoda delegatului dvs. de extindere este chemată numai pentru ca aplicația dvs. să poată răspunde la operația de rețea care este finalizată. WKURLSessionRefreshBackgroundTask nu vă oferă acces la URLSession obiect și nici datele transferate. Singura proprietate suplimentară pe care o definește este un șir numit sessionIdentifier pe care le puteți utiliza pentru a determina ce proces de rețea a fost finalizat.

Programarea unei reîmprospătare

Există o serie de moduri în care puteți programa o reîmprospătare a fundalului în watchOS 3. Pentru o aplicație simplă sau o actualizare instantaneu, puteți utiliza următoarele două metode pe oricare dintre WKExtension obiect. 

scheduleBackgroundRefresh (withPreferredDate: userinfo: scheduledCompletion :)

Când este finalizată, această metodă va reveni a WKApplicationRefreshBackgroundTask obiecte la delegatul dvs. de extindere. Sistemul watchOS va încerca să vă trezească extensia în fundal în momentul specificat de Data parametru. 

Rețineți că nu este garantat ca aplicația dvs. să fie trezită în fundal la acest moment precis. Datorită altor circumstanțe (cum ar fi bateria rămasă, alte aplicații care rulează în memorie etc.), sistemul poate decide să vă trezească ulterior aplicația. 

userinfo parametrul va fi accesibil prin oricare dintre obiectele de sarcină de fundal transmise delegatului dvs. de extensie. Acest lucru poate fi util în special dacă trebuie să trimiteți informații referitoare la actualizarea curentă. În cele din urmă, scheduledCompletion parametrul poate furniza un bloc de cod care va fi rulat odată ce reîmprospătarea a fost programată sau a eșuat din cauza unei erori.

scheduleSnapshotRefresh (withPreferredDate: userinfo: scheduledCompletion :) 

Această metodă va reveni a WKSnapshotRefreshBackgroundTask obiecte la delegatul dvs. de extindere. Parametrii pentru această metodă sunt identici cu cei care planifică o reîmprospătare obișnuită a aplicației. Singura diferență cu această metodă este tipul de actualizare pe care îl programați.

Următoarea este o bucată de cod exemplu care poate fi folosită oriunde în aplicația dvs. watchOS pentru a programa o reîmprospătare a fundalului:

Wakextension.shared (). ScheduleBackgroundRefresh (cuPreferredDate: Date (timeIntervalSinceNow: 60 * 60), userInfo: nil)  .localizedDescription) "

Crearea altor sarcini de fundal

După cum am menționat mai devreme, a WKWatchConnectivityRefreshBackgroundTask este creată ca răspuns la trimiterea de date către ceas de la iPhone-ul său asociat prin API-urile WatchConnectivity. 

Ultimul tip de sarcină de fundal, WKURLSessionRefreshBackgroundTask, este programată automat de sistem atunci când creați o URLSession obiect cu o configurație de fundal. Făcând acest lucru de oriunde din aplicația ceasului, sistemul va programa automat cererea pentru dvs. și va apela delegatul de extensie mâner(_:) atunci când este finalizată. Următorul cod exemplu conține două funcții dintr-o clasă exemplu. Prima funcție configurează și inițiază o sarcină de descărcare de fundal. Al doilea este o metodă delegată declarată în URLSessionDelegate protocol.

(de exemplu: config, delegate: self, delegateQueue: nil) lăsați task = session.downloadTask (cu: URL (șir: "http://www.example.com/data")!) task.resume () func urSession (sesiune: URLSession, task: URLSessionTask, eroare didCompleteWithError: Eroare? ")

2. Vizionați instantaneele aplicației

În WatchOS 3, privirile pentru aplicații au fost eliminate în întregime de la Apple Watch și în schimb au fost înlocuite de doc. Această stație de andocare este accesată prin apăsarea butonului lateral de pe ceas și conține orice număr de aplicații pe care utilizatorul o poate configura:

Dacă aplicația dvs. a fost plasată în stația de andocare a unui utilizator, atunci sunteți responsabil de păstrarea actualizată a "instantaneului" afișat în stația de andocare până la data de. 

Aplicația dvs. este notificată când trebuie să actualizați instantaneul dvs. cu ajutorul unui WKSnapshotBackgroundRefreshTask fiind transmise în delegatul dvs. de prelungire mâner(_:) metodă. Când primiți această notificare, în plus față de extensia WatchKit care se trezește în fundal, controlerul interfeței de bază a aplicației este, de asemenea, trezit în fundal și în afara ecranului. În acest proces, următoarele metode sunt numite în această ordine:

  1. Interfața rădăcină a interfeței treaz (withContext :) metodă
  2. Interfața rădăcină a interfeței willActivate () metodă
  3. Extensia delegatului mâner(_:) metodă

În orice moment al acestor trei metode, puteți particulariza aspectul interfeței aplicației dvs. pentru a crea fotografia afișată în doc.

Ultimul pas de reîmprospătare a instantaneului se întâmplă în delegatul de extindere mâner(_:) metodă. Ca și în cazul celorlalte tipuri de sarcini de fundal, trebuie să spuneți sistemului că sarcina a fost finalizată. Cu toate acestea, pentru actualizarea snapshot-ului, acest lucru se face prin apelarea setTaskCompleted (restoredDefaultState: estimatedSnapshotExpiration: userinfo :) metoda pe WKSnapshotBackgroundRefreshTask obiect. De îndată ce apelați această metodă, watchOS captează instantaneul interfeței curente a aplicației dvs. și o păstrează în memorie până la următoarea reîmprospătare. Pentru a înțelege mai bine această metodă, să trecem prin toți parametrii săi:

  • restoredDefaultState este doar o valoare booleană specificând dacă instantaneul dvs. este sau nu primul controler de interfață al aplicației dvs. Dacă ați trecut la o altă interfață, atunci treceți fals pentru această valoare. 
  • estimatedSnapshotExpiration este a Data obiect care specifică când sistemul ar trebui să încerce în continuare să actualizeze instantaneul aplicației. Dacă nu aveți nevoie să programați o altă actualizare imediat, puteți trece în noul Date.distantFuture proprietate clasa.
  • userinfo este o colecție de date personalizate și va fi trecută în următorul WKSnapshotBackgroundRefreshTask obiect dacă planificați imediat o altă actualizare.

3. Îmbunătățiri ale WatchConnectivity

Cadrul WatchConnectivity introdus în watchOS 2 și iOS 9 câștigă, de asemenea, unele funcționalități noi cu watchOS 3 și iOS 10. 

Dacă un utilizator a pus complicația aplicației pe fața ceasului, puteți transfera date de la telefon la ceas de până la 50 de ori într-o singură zi. Acest lucru se face, ca și în iOS 9 și watchOS 2, prin WCSession transferCurrentComplication (userinfo :) exemplu. Nou în watchOS 3 și iOS 10 este WCSession remainingComplicationUserInfoTransfers proprietate, care vă va spune câte transferuri rămân pentru acea zi.

Un altul nou WCSession proprietate adăugată cu actualizări de ani din acest an este hasContentPending proprietate, care este doar o valoare booleană care semnifică dacă există sau nu date care urmează să fie transferate între iPhone și Apple Watch.

Dacă doriți să aflați mai multe despre WatchConnectivity și cum funcționează, puteți consulta tutorialele noastre anterioare care acoperă cadrul.

  • watchOS 2: Comunicarea cu un contrapartid

    Eliberarea lui watchOS 2 aduce schimbări semnificative. Una dintre aceste schimbări este capacitatea de a comunica cu ușurință cu un omolog. Sunt…
    Jorge Costa
    WatchKit
  • watchOS 2: Transferuri de fond și cozi

    Watch Connectivity este un nou cadru de comunicare lansat alaturi de iOS 9 si watchOS 2. Scopul principal este transferul usor si ...
    Davis Allie
    WatchKit

Concluzie

În general, noile interfețe API din watchOS 3 vă permit să actualizați rapid și eficient conținutul aplicației Apple Watch în fundal. Pe măsură ce mai multe aplicații adoptă aceste noi API-uri, performanța aplicațiilor watchOS în general se va îmbunătăți considerabil și va crea o experiență mult mai bună pentru utilizatori.

Replica GitHub legată conține un proiect watchOS 3 Xcode cu un exemplu de cod care arată modul în care puteți programa și răspunde la reîmprospătarea fundalului în propriile aplicații.

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

Cod