Alături de iOS 9 și watchOS 2, Apple a introdus resurse la cerere, un nou API pentru livrarea de conținut către aplicațiile dvs., reducând în același timp spațiul pe care aplicația îl ocupă pe dispozitivul utilizatorului. Cu resurse la cerere, puteți să etichetați anumite active ale aplicației dvs., să le găzduiți pe serverele Apple, permițându-le utilizatorilor să le descarce atunci când este necesar. În acest tutorial, vă voi arăta elementele de bază ale resurselor la cerere prin crearea unei aplicații de bază pentru vizualizarea imaginilor.
Acest tutorial necesită să executați Xcode 7+ și să cunoașteți dezvoltarea iOS. De asemenea, va trebui să descărcați proiectul inițial GitHub.
Resursele la cerere au fost introduse în iOS 9 și watchOS 2 pentru scopul principal de a reduce cantitatea de spațiu pe care aplicațiile individuale le ocupă pe un dispozitiv. Un alt avantaj important al resurselor la cerere este faptul că aplicația dvs. poate fi descărcată și deschisă de utilizatori mult mai rapid.
Resursele la cerere lucrează prin atribuirea unor unice Etichete la resursele din cadrul Xcode pentru a crea ceea ce se numește an pachet de active. Aceste pachete pot include orice din cataloagele de active (imagini, texturi SpriteKit, date etc.) sau chiar alte fișiere, cum ar fi OpenGL și Shaders Metal, precum și scenele SpriteKit și SceneKit și sistemele de particule.
Când trimiteți aplicația la App Store, aceste resurse sunt, de asemenea, încărcate și sunt găzduite acolo pentru a fi descărcate în orice moment. Pentru a descărca pachetele de active la momentul executării într-o aplicație, pur și simplu utilizați eticheta pentru fiecare pachet pe care l-ați alocat în Xcode.
Cele două aspecte principale ale unei aplicații care utilizează resursele la cerere sunt: pachet de aplicații, care este plin de cod executabil pentru aplicația dvs. și activele esențiale, cum ar fi pictogramele de interfață cu utilizatorul și pachete de active.
Pentru aceste pachete de active, există trei categorii principale pe care le puteți organiza în Xcode:
Aplicațiile care sunt construite cu suport pentru resursele la cerere trebuie, de asemenea, să respecte următoarele limite în ceea ce privește dimensiunea fișierului:
Rețineți că totalul de 20 GB nu este responsabil tăierea aplicațiilor în timp ce toate celelalte totaluri fac. Ce este segmentarea aplicațiilor? Splitarea aplicațiilor este o altă caracteristică introdusă în iOS 9 pentru a reduce dimensiunea aplicațiilor. Aceasta face acest lucru doar prin analizarea resurselor specifice dispozitivului în care este instalată aplicația. De exemplu, dacă cataloagele de active sunt utilizate corect, o aplicație instalată pe un iPhone 6 Plus sau 6s Plus, trebuie doar să descarce imaginile la scară 3x și să nu vă faceți griji cu privire la scalele 1x și 2x. Pentru resursele la cerere, cele 20 de GB de resurse totale pe care le puteți încărca pe serverele App Store este suma totală toate tipuri de dispozitive. Toate celelalte limite sunt pentru fiecare dispozitiv specific în care este instalată aplicația.
În ceea ce privește ștergerea datelor (curățarea) datelor, pachetele de materiale pe care le-a descărcat aplicația dvs. vor fi eliminate numai când dispozitivul în care este instalat aplicația este în afara spațiului disponibil. Când se întâmplă acest lucru, sistemul de resurse la cerere va privi toate aplicațiile de pe dispozitiv și după selectarea acestora se va examina proprietatea de păstrare a fiecărui pachet de materiale, precum și când a fost folosit ultima dată. Un lucru important este să notați că pachetele de materiale pentru aplicația dvs. nu vor fi niciodată curățate în timp ce aplicația dvs. rulează.
Deschideți proiectul starter în Xcode și rulați aplicația în Simulatorul iOS. În prezent, această aplicație de bază conține o colecție de imagini fiecare cu o combinație a uneia dintre cele trei culori (roșu, verde sau albastru) și una din cele patru forme (cerc, pătrat, stea sau hexagon). Cu aplicația care rulează, navigați la Culori> Roșu și veți vedea o singură imagine a cercului roșu afișată pe ecran.
În această aplicație, vom seta un total de șapte pachete de active, una pentru fiecare culoare și una pentru fiecare formă. O altă caracteristică excelentă a resurselor la cerere este aceea că o singură resursă poate fi atribuită mai mult de o etichetă. Cercul roșu, de exemplu, poate face parte din ambele roșu pachet de active și Cerc pachet de active.
API-ul de resurse la cerere este de asemenea suficient de inteligent pentru a nu descărca sau copia aceeași resursă de două ori. Cu alte cuvinte, dacă o aplicație ar fi descărcat deja roșu pachet de active și apoi a vrut să încarce Cerc pachet de materiale, imaginea cercului roșu nu va fi descărcată din nou.
În Xcode, deschideți Assets.xcassets. Ar trebui să vedeți toate cele 12 imagini, după cum se arată mai jos.
Apoi, selectați Piața albastră setați imaginea și deschideți imaginea Atribuții Inspector pe dreapta.
Veți vedea că Atribuții Inspector include un nou La etichetele resurselor de cerere care este locul unde atribuiți etichete fiecărei resurse. Pentru setul de imagine albastră pătrată, introduceți Albastru și Pătrat în La etichetele resurselor de cerere camp. Aceasta înseamnă că setul de imagini are acum două etichete care îi sunt atribuite.
Rețineți că proiectul de pornire include deja etichete de resurse pentru nouă din cele douăsprezece seturi de imagini. Aceasta explică de ce Xcode oferă opțiuni de completare automată pentru dvs. când ați introdus aceste etichete.
Odată ce ați finalizat atribuirea etichetelor pentru Piața albastră set de imagini, adăugați etichetele corecte la ambele Verde hexagon și Red Circle seturile de imagini, după cum se arată mai jos.
Cu ajutorul etichetelor de resurse la cerere, configurați corect, deschideți fereastra Project Navigator pe stanga. Deschide Etichete de resurse în partea de sus și selectați predescărcat filtrați în partea de sus.
Acum puteți vedea cât de mare este fiecare pachet de active și exact ce resurse sunt în fiecare dintre ele. Toate filtru vă arată fiecare dintre resursele la cerere. predescărcat filtrul arată resursele la cerere pe categorii și vă permite să mutați resurse dintr-o categorie în alta:
Aceste secțiuni reflectă cele trei categorii de pachete de active pe care le-am prezentat mai devreme. Un important lucru de reținut este faptul că pachetele de active pe care le puneți în Ordine de etichete preconfecționate secțiunea va începe descărcarea în ordinea în care apar.
Cu etichete atribuite fiecărui set de imagini, este timpul să începeți să accesați resursele din proiect.
Accesarea pachetelor de materiale care sunt găzduite pe serverele App Store este gestionată de noul NSBundleResourceRequest
clasă. O instanță din această clasă este creată cu un set de etichete pe care doriți să le utilizați. Acesta informează sistemul despre utilizarea de către dumneavoastră a pachetelor de active corespunzătoare. Dealocarea acestora NSBundleResourceRequest
obiecte este cel mai bun și mai ușor mod de a spune sistemul de operare când nu mai folosiți un anumit pachet de materiale. Acest lucru este important pentru a nu depăși limita de 2 GB pentru resursele utilizate.
În proiectul dvs., deschis DetailViewController.swift și adăugați următoarea proprietate la DetailViewController
clasă.
cerere var: NSBundleResourceRequest!
Apoi, înlocuiți-vă viewDidAppear (_ :)
cu următoarele metode:
override funcția viewDidAppear (animat: Bool) super.viewDidAppear (animat) request = NSBundleResourceRequest (etichete: [tagToLoad]) request.beginAccessingResourcesWithCompletionHandler (eroare: NSError? NSOperationQueue.mainQueue (). AddOperationWithBlock (() -> Void în auto.displayImages ())
Cu acest cod, mai întâi inițializați cerere
proprietate cu un set care include o singură etichetă. Setul de etichete pe care îl furnizați acestui inițializator conține valori de șir. În acest caz, folosim tagToLoad
proprietate, care este setată de către controlorii de vizualizare anteriori din aplicație.
Apoi, începem să descărcăm pachetele de materiale pentru etichetele specificate apelând beginAccessingResourcesWithCompletionHandler (_ :)
. Această metodă va accesa toate resursele cu etichetele specificate și va porni automat o descărcare dacă este necesar. După ce accesați resursele în acest mod, tot celălalt cod pentru încărcarea acestor resurse în aplicația dvs. rămâne același.
Rețineți că, dacă doriți să accesați numai resurse care au fost deja descărcate, fără a încărca conținut, puteți utiliza conditionallyBeginAccessingResourcesWithCompletionHandler (_ :)
metodă.
După cum se arată în codul de mai sus, un lucru important pe care trebuie să-l amintiți despre acest handler de completare este că el este numit pe un fir de fundal. Aceasta înseamnă că orice actualizare a interfeței de utilizator pe care doriți să o efectuați la finalizare va trebui să fie executată pe firul principal.
Construiți și rulați din nou aplicația dvs. și alegeți o culoare sau o formă pe care să o vizualizați în aplicație. Ar trebui să vedeți toate cele trei imagini colorate pentru o anumită formă sau toate cele patru forme pentru o anumită culoare.
Este atât de simplu să utilizați resursele la cerere. Ați implementat cu succes resursele la cerere într-o aplicație.
O caracteristică importantă de depanare disponibilă în Xcode 7 este capacitatea de a vedea ce pachete de materiale ați descărcat și care sunt utilizate. Pentru a vedea acest lucru, navigați la Debug Navigator cu aplicația care rulează și selectați Disc. Veți vedea un ecran similar celui prezentat mai jos. Resurse la cerere este secțiunea care ne interesează.
De exemplu, să schimbăm acum prioritatea de descărcare, astfel încât unele resurse să fie descărcate întotdeauna imediat. În același timp, vom schimba prioritățile de conservare a pachetelor de active astfel încât Hexagon și Stea pachetele de active sunt curățate înainte de Cerc și Pătrat pachete de active. Actualizați punerea în aplicare a viewDidAppear (_ :)
așa cum se arată mai jos.
override funcția viewDidAppear (animat: Bool) super.viewDidAppear (animat) request = NSBundleResourceRequest (etichete: [tagToLoad]) request.loadingPriority = NSBundleResourceRequestLoadingPriorityUrgent NSBundle.mainBundle () setPreservationPriority (1.0, forTags: ]) NSBundle.mainBundle () setPreservationPrioritatea (0.5, forTags: ["Hexagon", "Star"]) request.beginAccessingResourcesWithCompletionHandler (eroare: NSError? NSOperationQueue.mainQueue () addOperationWithBlock (() -> Void în auto.displayImages ())
După inițializarea solicitării, setăm opțiunea loadingPriority
proprietate la NSBundleResourceRequestLoadingPriorityUrgent
. Alternativ, puteți atribui un număr între 0.0 și 1.0 la această proprietate pentru a dicta prioritatea de încărcare în aplicația dvs..
Avantajul utilizării acestei constante este că ea dă automat cererii cea mai mare prioritate de încărcare, dar ignoră și activitatea curentă a procesorului. În unele situații, dacă CPU-ul dispozitivului este utilizat în mod intens, descărcarea unui pachet de materiale poate fi întârziată.
Apoi, setăm prioritatea de conservare pentru toate cele patru etichete de formă. Aceasta se face prin apelarea setPreservationPriority (_: forTags :)
metoda pachetului principal al aplicației. Acum am asigurat că, dacă sistemul de resurse la cerere trebuie să elimine anumite active din aplicația noastră, Hexagon și Stea pachetele de active vor fi șterse mai întâi.
Acum, că știți cum să implementați resursele la cerere într-o aplicație iOS, vreau să vă spun pe scurt despre câteva bune practici pe care să le aveți în minte.
Pe lângă reducerea timpilor de descărcare și creșterea accesibilității resurselor, păstrarea fiecărui pachet de materiale cât mai redus posibil împiedică sistemul să depășească curățarea. Acesta este momentul în care sistemul de resurse la cerere trebuie să elibereze o anumită cantitate de spațiu și să se elibereze mult mai mult decât este necesar.
De exemplu, dacă sistemul a necesitat eliberarea a 50MB de spațiu și, pe baza condițiilor menționate anterior, a decis că un pachet de active de 400MB din aplicația dvs. a fost cel mai potrivit pentru a fi șters, sistemul va suprateranează 350 MB. Aceasta înseamnă că, dacă aplicația dvs. a pierdut mai multe date decât este necesar, va trebui să descarce din nou toate resursele asociate etichetei respective. Dimensiunea recomandată pentru etichetele individuale este de aproximativ 64 MB.
Dacă aplicația dvs. are o interacțiune foarte predictibilă cu utilizatorul, atunci este mai bine să începeți să descărcați resurse înainte de a fi efectiv necesare. Acest lucru este de a îmbunătăți experiența utilizatorului, deoarece atunci nu trebuie să vă uitați la ecranul de încărcare în timp ce aplicația dvs. descarcă conținut.
Jocurile sunt un exemplu comun. Dacă jucătorul tocmai a terminat nivelul 5, atunci este o idee bună să începi să descarci nivelul 7 în timp ce joacă nivelul 6.
După ce ați terminat folosind un anumit pachet de materiale, asigurați-vă că vă fie NSBundleResourceRequest
obiect este dealocat sau sunați endAccessingResources
pe ea.
Nu numai că aceasta va evita ca aplicația dvs. să atingă limita de 2 GB pentru resursele în utilizare, ci va ajuta și sistemul de resurse la cerere să știe când aplicația utilizează acele resurse, ceea ce înseamnă că poate decide mai bine ce trebuie curățat dacă este mai mult spațiu Necesar.
Recent am scris despre dezvoltarea tvOS și în tutorial am menționat limitările aplicațiilor tvOS. Dimensiunea maximă pentru un pachet de aplicații este de 200 MB, deci este foarte recomandat să utilizați resursele la cerere în aplicațiile tvOS ori de câte ori este posibil.
Datorită asemănărilor dintre tvOS și iOS, limitele API și limitele de stocare (cu excepția pachetului de aplicații) pentru resursele la cerere sunt aceleași. Cu toate acestea, atunci când lucrați cu resurse la cerere pe tvOS, este important să rețineți că toate activele, cum ar fi imaginile, au o singură versiune scară 1x, astfel încât mărimea pachetelor dvs. de active, așa cum se arată în Xcode, nu va scădea din cauza tăierii aplicațiilor.
Resursele la cerere în iOS 9 și tvOS reprezintă o modalitate excelentă de a reduce dimensiunea aplicației dvs. și de a oferi o experiență mai bună utilizatorilor celor care descarcă și utilizează aplicația. Deși este foarte ușor de implementat și de configurat, există destul de multe detalii pe care trebuie să le țineți minte pentru ca întregul sistem de resurse la cerere să funcționeze fără probleme, fără a fi nevoie de timpi de încărcare excesivi și de curățare inutilă a datelor.
Ca întotdeauna, asigurați-vă că părăsiți comentariile și comentariile dvs. în comentariile de mai jos.