iOS 7 SDK îmbunătățiri multitasking

Acest tutorial vă va învăța despre ultimele îmbunătățiri de multitasking oferite de kitul iOS 7 SDK. În mod specific, veți afla despre API-urile de preluare a fundalului, notificări la distanță și API pentru transferul de fond. Citește mai departe!


Prezentare multitasking

Cu iOS 7, Apple a pus la dispoziția dezvoltatorilor trei noi API-uri de multitasking:

  • Încărcarea fundalului
  • Notificări la distanță
  • Serviciul de transfer de fundal

Toate aceste API-uri oferă programatorilor posibilitatea de a dezvolta aplicații multitasking care vor utiliza mai bine hardware-ul aparatului, oferind utilizatorilor o experiență mai mare. Acest tutorial vă va învăța mai multe despre cele trei îmbunătățiri de mai sus și când să le folosiți.


Încărcarea fundalului

Pentru a face Încărcarea fundalului API mai ușor de înțeles, imaginați-vă că doriți să construiți o aplicație de știri. Din punct de vedere ipotetic, presupunem că conținutul acestei aplicații este furnizat de pe web și una dintre caracteristicile esențiale este să primești actualizări de fiecare dată când utilizatorul lansează aplicația.

Înainte de iOS 7, dezvoltatorii ar putea face ca aplicația să înceapă să obțină conținut nou de îndată ce a fost lansat. Acest lucru funcționează, dar dezavantajul este că utilizatorii vor trebui să aștepte un timp de fiecare dată când începe aplicația. De asemenea, viteza de conectare a telefonului devine un factor semnificativ. Imaginați-vă dacă utilizatorul se conectează printr-o rețea celulară după o săptămână sau două de inactivitate! Desigur, acest lucru nu este ceea ce doresc dezvoltatorii, deoarece tinde să degradeze experiența utilizatorului.

Pe iOS 7, lucrurile s-au schimbat drastic! Cu aplicația Background Fetch API, aplicația noastră ipotetică poate descărca conținut nou pasiv, rămânând în continuare în fundal. iOS 7 va trezi aplicația, va oferi timp de execuție a fundalului și, atunci când aplicația termină actualizarea, va reveni din nou la somn. Desigur, utilizatorii nu sunt anunțați când se întâmplă acest lucru. Ei găsesc pur și simplu noul conținut gata de lansare a aplicației.

Procesul de actualizare poate avea loc la intervale predefinite stabilite de programator sau în intervale specificate de sistemul de operare. Dacă setați intervale personalizate, Apple recomandă să le setați cu înțelepciune și să nu preluați date foarte des pe fundal. Acest lucru va duce la scurgerea bateriilor și la pierderea resurselor sistemului. Dacă lăsați pur și simplu sistemul de operare să gestioneze lucrurile, iOS 7 va face predicții de utilizare. Aceasta face acest lucru observând cât de des este lansată aplicația și în ce momente. Apoi, ea anticipează acest comportament accesând online și preluând conținutul înainte de a prezice că utilizatorul o va dori. De exemplu, dacă un utilizator din aplicația noastră de știri ipotetice lansează aplicația în fiecare după-amiază, iOS observă acest lucru și decide că aplicația trebuie să aducă conținut cândva în după-amiaza și înainte de ora obișnuită de lansare. Foarte tare!

Procesul de preluare descris mai sus include trei etape:

  1. Pentru a activa capacitatea de preluare a fundalului
  2. Pentru a seta intervalul minim de interval
  3. Pentru a implementa noua metodă de delegat cerere: performFetchWithCompletionHandler:

Să examinăm lucrurile în detaliu.

Așa cum am menționat deja, primul pas în întregul proces este de a permite captarea de fundal a aplicației în Xcode 5. Acest lucru se poate face în două moduri. Prima modalitate este de a utiliza .plist fișier, în cazul în care trebuie să adăugați Moduri de fundal necesare cheie cu aduce valoare, după cum urmează:


Următorii pași reprezintă o abordare alternativă:

  • Faceți clic pe numele proiectului din partea superioară stângă în Xcode
  • Faceți clic pe fila Capabilități din fereastra de mijloc
  • În opțiunea Moduri de fundal, bifați caseta de selectare Ferește în fundal

În mod prestabilit, valoarea intervalului inițial de preluare este setată la UIApplicationBackgroundFetchIntervalNever mod, ceea ce înseamnă că preluarea fundalului nu va fi efectuată niciodată. Dacă această valoare nu se modifică, preluarea de fundal nu va funcționa, chiar dacă este activată în unul din cele două moduri discutate mai sus. Pentru a realiza acest lucru, trebuie să mergeți la aplicare: didFinishLaunchingWithOptions: și setați valoarea intervalului minim de preluare după cum urmează:

 - (BOOL): aplicație (UIApplication *) didFinishLaunchingWithOptions: (NSDictionary *) launchOptions [cerere setMinimumBackgroundFetchInterval: UIApplicationBackgroundFetchIntervalMinimum]; reveniți DA; 

UIApplicationBackgroundFetchIntervalMinimum este valoarea minimă a intervalului permisă și gestionată de sistem. Desigur, puteți seta un interval de timp personalizat prin simpla furnizare a metodei de mai sus cu ajutorul funcției a NSTimeInterval valoare. Cu toate acestea, dacă nu este necesar, este în general mai bine să permiteți sistemului iOS să decidă când ar trebui să permită aplicației să lucreze în fundal și să preia conținut nou. Dacă setați un minim, este important să înțelegeți că UIApplicationBackgroundFetchIntervalMinimum nu determină absolut momentul. Ele sunt mai degrabă sugestii. iOS va încerca să urmeze programul, dacă poate, însă, în funcție de resursele de sistem disponibile, preluarea se poate întâmpla mai mult sau mai puțin des decât doriți.

Ultimul pas necesar este implementarea programului nou adăugat cerere: performFetchWithCompletionHandler: metoda delegată. Aceasta se numește de fiecare dată când trebuie efectuată o preluare de fundal. Instrumentul de completare a metodei acceptă oricare din următoarele trei valori pentru a lăsa iOS-ul să afle despre rezultatele preluării:

  1. UIBackgroundFetchResultNewData: Dacă au fost găsite date noi prin preluare
  2. UIBackgroundFetchResultNoData: Dacă nu s-au găsit date noi
  3. UIBackgroundFetchResultFailed: Dacă a apărut o eroare în timpul procesului de preluare

Să vedem acest lucru în acțiune:

 -(void) cerere: (UIApplication *) cerere performFetchWithCompletionHandler: (void (^) (UIBackgroundFetchResult)) completionHandler // Apelați sau scrieți orice cod necesar pentru a obține date noi, procesați-l și actualizați UI. // Logica pentru informarea iOS despre rezultatele preluării în limbaj simplu: dacă (/ ** DATE NOI EXISTĂ ȘI S-AU FOST PROCESAT SUCCESUL ** /) completionHandler (UIBackgroundFetchResultNewData);  dacă (/ ** NU EXISTĂ DATE NOI ** /) completionHandler (UIBackgroundFetchResultNoData);  în cazul în care (/ ** orice eroare se produce ** /) completionHandler (UIBackgroundFetchResultFailed); 

În cazul în care se găsesc date noi, trebuie să efectuați, de asemenea, orice actualizare a interfeței cu utilizatorul. Acestea trebuie să se întâmple imediat din două motive: (1) utilizatorii ar trebui să vadă conținutul în momentul lansării aplicației și (2) instantaneul aplicației va rămâne actualizat.

Mai sunt câteva fapte pe care ar trebui să le știi. În primul rând, atunci când aplicația se lansează în fundal, are la dispoziție aproximativ treizeci de secunde pentru a finaliza toate sarcinile solicitate și pentru a apela serviciul de completare. Dacă această limită de timp este depășită, aplicația va fi suspendată din nou. Pentru aplicațiile care au nevoie de mai mult de 30 de secunde (probabil din cauza descărcărilor media), trebuie să programați o preluare de fundal utilizând API-ul Serviciului de transfer de fond. Vom discuta această opțiune mai târziu.

După ce ați instalat mecanismul de încărcare și sunteți pregătit să lucrați, Apple oferă două modalități de a testa încărcarea de fundal atunci când utilizați Simulatorul.

Prima abordare urmează acești pași:

  • Rulați aplicația ca de obicei pe Simulator
  • În timp ce aplicația rulează, reveniți la Xcode
  • Faceți clic pe Debug> Simulați preluarea fundalului meniul

Acest mod este util pentru a încerca API-ul în timp ce aplicația rulează. Al doilea mod este mai implicat, dar vă permite să testați aplicația în timp ce aceasta rămâne în fundal. Pentru a încerca acest lucru, urmați acești pași:

  • Mergeți la Scheme listă și faceți clic pe Gestionați scheme ... opțiune.

  • Asigurați-vă că schema curentă este selectată și apoi duplicați-o făcând clic pe butonul roată din partea de jos a ferestrei și selectând Duplicat.

  • Stabiliți un nume pentru duplicat dacă doriți.
  • Au Alerga opțiunea selectată în panoul din stânga, apoi faceți clic pe Opțiuni fila.
  • Verifică Lansați din cauza unui eveniment de preluare a fundalului și faceți clic pe O.K de două ori.

  • Rulați aplicația folosind schema duplicată.

Încărcarea de fundal este destinată a fi utilizată pentru actualizările de aplicații non-critice, deoarece timpul în care se produce poate diferi. Pentru mai multe actualizări critice, consultați secțiunea Notificări la distanță care apare în continuare. În general, API-ul de preluare a fundalului este potrivit pentru aplicațiile care doresc să gestioneze fără probleme conținutul. Câteva exemple de categorii de aplicații includ știri, rețele sociale, vreme și partajarea fotografiilor.


Notificări la distanță

Imaginați-vă că construim o aplicație cu tutoriale scrise și video. Să presupunem că utilizatorii pot descărca videoclipuri de tutorial de 2-3 ori pe lună. Deci, cum ne-ar face pe utilizatorii noștri conștienți de noi versiuni video? Nu putem adopta o soluție care să utilizeze API-ul de preluare a fundalului sau ceva similar, deoarece acest lucru ar duce atât la pierderea resurselor dispozitivului, cât și la solicitările inutile către server. De asemenea, nu putem ști când este lansată o nouă versiune video. Prin urmare, trebuie să folosim notificările push, de fiecare dată când există un conținut nou, putem permite utilizatorilor noștri să știe despre acest lucru prin simpla alertare a acestora. Ne-am aștepta ca utilizatorii să lanseze aplicația și să descarce conținut nou. Problema este că această abordare obligă utilizatorul să aștepte descărcarea videoclipului și, dacă conținutul este suficient de mare, poate fi necesar să aștepte mult timp. Deci, cum pot utilizatorii să obțină un conținut nou în aplicația lor atunci când acest conținut este disponibil, dar fără așteptare?

Acesta este locul în care notificările de la distanță vin la îndemână. Notificările la distanță sunt de fapt notificări silențioase, ceea ce înseamnă notificări push care nu informează utilizatorii despre existența lor. Atunci când sosește o nouă notificare la distanță, sistemul scoate în tăcere aplicația, astfel încât să se poată ocupa de notificare. Aplicația este apoi responsabilă pentru inițierea procesului de descărcare pentru noul conținut. Când se termină descărcarea, a notificare locală este trimis utilizatorului. Când aplicația este lansată, noul conținut este așteptat de utilizator.

La fel ca și preluarea de fundal, notificările de la distanță urmăresc să elimine timpul de așteptare cu care se confruntă utilizatorii atunci când descarcă conținut nou sau încarcă date către un server. Ambele API-uri funcționează în cadrul firului de fundal, iar utilizatorii sunt anunțați după terminarea lucrării. Cu toate acestea, notificările de la distanță sunt potrivite în cazurile în care conținutul este fie actualizat rar sau este altfel esențial pentru experiența utilizatorului.

Pentru a utiliza notificările la distanță într-o aplicație, va trebui mai întâi să le activați. Puteți face acest lucru fie cu fișierul * .plist, fie cu noul Capacități fila proiect. Dacă doriți să utilizați fișierul * .plist, trebuie să adăugați Contextul necesar cheie cu valoarea de notificare la distanță după cum urmează:


Pentru a utiliza fila Capabilități, urmați acești pași:

  • Faceți clic pe numele proiectului din partea superioară stângă în Xcode
  • Faceți clic pe Capacități în fereastra de mijloc
  • Sub Moduri de fundal opțiune, verificați Notificări la distanță Caseta de bifat

Următorul pas este implementarea cerere: didReceiveRemoteNotification: fetchCompletionHandler: delegați metoda în fișierul AppDelegate. Aceasta se numește atunci când apare o nouă notificare. Utilizați handlerul de terminare pentru a anunța iOS despre rezultatul preluării datelor:

 -(void) aplicație: (UIApplication *) cerere didReceiveRemoteNotification: (NSDictionary *) userInfo fetchCompletionHandler: (void (^) (UIBackgroundFetchResult)) completareHandler // Apel sau scrie orice cod necesar pentru a descărca date noi. completionHandler (UIBackgroundFetchResultNewData); 

A face o notificare silențioasă este destul de ușoară. În sarcina utilă de notificare trebuie doar să includeți cod-disponibil: 1 semnalizează și omite orice date de avertizare sau de sunet care ar notifica utilizatorul.

 aps conținut-disponibil: 1

În general, tot ceea ce este valabil când lucrați cu Fetchul de fundal se aplică și aici. De exemplu, aveți la dispoziție maximum 30 de secunde pentru a descărca orice conținut nou și pentru a anunța sistemul în metoda de mai sus, înainte ca aplicația să revină din nou la somn. Dacă noul conținut are nevoie de timp pentru a fi descărcat, atunci luați în considerare utilizarea acestuia Serviciul de transfer de fundal API-ul.

Rețineți că Apple controlează rata de livrare a notificărilor la distanță (notificări push silent) trimise de la un furnizor push. Dacă rata este normală, atunci notificările normale și silențioase sunt livrate imediat. Cu toate acestea, atunci când notificările silențioase sunt trimise destul de frecvent, serviciul Apple Push le stochează pentru livrare ulterior. Asigurați-vă că trimiteți cu înțelepciune orice notificări la distanță.


Serviciul de transfer de fundal

O altă caracteristică excelentă a iOS 7 este Serviciul de transfer de fundal API-ul. În mod tradițional, obținerea sau trimiterea unor bucăți mari de date nu a fost ușoară, în principal datorită limitărilor de timp de funcționare și gestionării datelor transferate. Aplicațiile au fost solicitate pentru a termina cea mai mare parte a procesului de încărcare sau descărcare în timp ce se aflau în prim-plan. Cu toate acestea, cu iOS 7, lucrurile sunt complet diferite. Aplicațiile se pot bucura de o mai mare libertate atunci când desfășoară activități de fundal. Mai întâi, cu serviciul de transfer de fundal, cererile sunt date cât timp au nevoie pentru a finaliza un transfer. Indiferent dacă se află în prim-plan sau în fundal, este irelevant. Restricțiile de timp nu mai există și sistemul este acum responsabil pentru gestionarea datelor încărcate sau descărcate. Chiar dacă o aplicație nu se execută, iOS se trezește pentru a rezolva situațiile în care trebuie luate decizii. Câteva exemple de acest lucru includ includerea unei descărcări a fișierelor sau furnizarea mai multor informații serverului.

Serviciul de transfer de fond se bazează pe NSURLSession , care tocmai a fost introdus cu iOS 7. Această clasă este responsabilă pentru transferul de date prin HTTP sau HTTPS și oferă capacitatea de a efectua sarcini legate de rețeaua de fundal. Întreaga idee din spatele ei este simplă și se bazează pe utilizarea a sesiuni, unde o singură sesiune gestionează toate sarcinile legate de transferul de date. Există diferite tipuri de sesiuni disponibile, dar sesiuni de fundal este cel care ne interesează aici și lucrează întotdeauna pe fire separate (procese) create de sistem. Semnăturile de fundal acceptă atât descărcarea (NSURLSessionDownloadTask) și încărcați (NSURLSesssionUploadTask), care sunt adăugate la fundal NSURLSession obiecte.

Un alt aspect demn de remarcat referitor la transferurile de fond este acela că transferul poate fi discreționar sau nediscreționar. Transferurile nediscreționare pot fi inițiate numai atunci când aplicația se află în prim-plan, dar există o opțiune de a stabili starea discreționară în funcție de nevoile aplicației. Transferurile discreționare sunt preferate, deoarece acestea permit sistemului de operare să realizeze o gestionare mai eficientă a energiei pe dispozitiv. Există, de asemenea, o limitare care se aplică transferurilor discreționare, și anume că acestea ar trebui să fie efectuate numai prin intermediul rețelelor WiFi. Transferurile de file de fond sunt inițiate întotdeauna ca transferuri discreționare.

Metoda delegatului cerere: handleEventsForBackgroundURLSession: completionHandler: se numește atunci când un transfer de fundal se termină, astfel încât sarcina finită poate fi rezolvată. De exemplu, dacă a fost descărcat conținut nou, trebuie să implementați această metodă de delegat pentru ao stoca permanent și pentru a actualiza interfața de utilizare, dacă este necesar. Această metodă este, de asemenea, apelată atunci când sunt necesare acreditări din aplicație pentru a continua transferul. În general, în această metodă de delegat aplicați toată logica necesară cerută de aplicația dvs. atunci când procesul de descărcare sau de încărcare se încheie și aplicația există în cadrul thread-ului de fundal. Desigur, utilizați instrumentul de completare pentru a lăsa sistemul să știe când ați terminat, astfel încât acesta să poată pune aplicația înapoi în starea de repaus.

Serviciul de transfer de fundal este ideal pentru utilizarea împreună cu preluarea de fundal și API-urile de notificare la distanță. Având în vedere cele de mai sus, devine clar că cea mai bună practică este de a utiliza metodele delegate ale preluării de fundal și ale notificărilor de la distanță către Puneți în coadă transferurile dvs. și lăsați sistemul să facă treaba. La urma urmei, cu excepția cazului în care datele care trebuie schimbate cu serverul au o amprentă redusă, în cele mai multe cazuri cele 30 de secunde furnizate doar celor două metode delegate menționate sunt suficiente pentru a configura transferul de fond și orice sarcini conexe. Folosește NSURLSession pentru a defini toate transferurile pe care le doriți și pentru a vă asigura că aplicația dvs. va prelua orice conținut nou. De asemenea, va trimite orice date care trebuie procesate, indiferent de timpul necesar.


Concluzie

Încărcarea de fundal, notificările la distanță și API-urile de servicii de transfer de fond sunt caracteristici pe care dezvoltatorii le-ar plăcea să le fi văzut cu mult timp în urmă. Din fericire, odată cu lansarea iOS 7, Apple a făcut mai ușor ca oricând să proceseze datele aplicației. De la iOS 7, conținutul aplicației poate fi întotdeauna actualizat, dar în cele din urmă este în sarcina fiecărui dezvoltator să se ocupe de acest lucru și să utilizeze instrumentele furnizate! Mulțumesc mulțumit și mulțumesc pentru lectură!

Cod