On-Demand Resources „este tehnologia Apple pentru încărcarea întârziată a conținutului aplicației”. În loc să includă toate resursele în pachetul de instalare, dezvoltatorul le plasează pe serverele App Store și le solicită după necesitate. Potrivit Apple ODR Guide, aceasta permite reducerea dimensiunii instalării inițiale și adăugarea de conținut nou fără actualizarea versiunii aplicației.
Principalele puncte
On-Demand Resources (ODR) „este un sistem de gestionare a conținutului încorporat în iOS, tvOS și macOS”. Acesta permite dezvoltatorului să împartă resursele aplicației în obligatorii (incluse în pachetul de instalare) și încărcabile la cerere (stocate în App Store și descărcate la necesitate).
Sistemul ODR operează cu trei entități cheie: etichete, pachete de resurse și solicitări. O etichetă este un șir de caractere identificator care unește un grup de fișiere. Un pachet de resurse este un set de date asociat cu o etichetă. O solicitare este un apel programatic NSBundleResourceRequest care inițiază încărcarea pachetului.
Încărcarea resursei trece prin mai multe etape: inițializarea solicitării cu specificarea etichetelor, verificarea disponibilității în stocarea locală, descărcarea de pe serverele Apple în absență, notificarea aplicației despre pregătire și eliberarea resursei după utilizare. Sistemul gestionează automat memorarea în cache și ștergerea resurselor neutilizate.
| Etapă | Acțiunea sistemului | Timp de execuție |
|---|---|---|
| Inițializare | Crearea NSBundleResourceRequest cu etichetă | Instant |
| Verificare cache | Căutarea resursei în stocarea locală | 0,1–0,5 s |
| Descărcare | Recepționarea de pe CDN Apple | Depinde de dimensiune |
| Notificare | Apelarea completion handler sau delegat | Instant |
| Eliberare | Marcarea resursei ca ștearsă de sistem | La cererea iOS |
Mecanismul ODR se bazează pe un serviciu de fundal care gestionează solicitările de resurse din stocarea cloud App Store. Când aplicația solicită o etichetă, sistemul verifică dacă resursa există în cache-ul local. Dacă nu „ începe descărcarea printr-o sesiune URL de fundal cu suport pentru reluare în caz de întrerupere a conexiunii.
import Foundation
class ResourceManager {
let odrRequest = NSBundleResourceRequest(tags: ["level-3"])
func loadLevel3() {
odrRequest.conditionallyBeginAccessingResources { available in
if available {
self.startLevel3()
} else {
self.odrRequest.beginAccessingResources { error in
guard error == nil else { return }
self.startLevel3()
}
}
}
}
func releaseResources() {
odrRequest.endAccessingResources()
}
}
Metoda conditionallyBeginAccessingResources verifică disponibilitatea resursei în cache fără încărcare imediată. Dacă indicatorul de disponibilitate este pozitiv „ aplicația continuă lucrul fără întârziere. Dacă resursa lipsește, beginAccessingResources pornește descărcarea cu indicarea progresului prin proprietatea progress.
Sistemul iOS gestionează singur prioritățile de încărcare a resurselor ODR în funcție de activitatea curentă a aplicației. Dacă aplicația este în prim-plan, încărcarea se face cu prioritate ridicată. În fundal, iOS poate amâna încărcarea sau o poate suspenda la baterie scăzută.
Resursele ODR pot include imagini, videoclipuri, fișiere audio, sprite-uri, datele nivelurilor și orice alte fișiere necritice pentru lansarea aplicației. Fiecare resursă este legată de una sau mai multe etichete care determină apartenența sa la un bloc funcțional.
În Xcode, etichetele se configurează prin inspectorul Resource Tags din fila Target Membership. Dezvoltatorul specifică pentru fiecare fișier din proiect dacă face parte din pachetul principal sau este încărcat prin etichetă. Un fișier poate aparține mai multor etichete, permițând reutilizarea resurselor între diferite secțiuni ale aplicației.
<!-- Exemplu de configurare Resource Tags în Info.plist -->
<key>NSBundleResourceRequestTags</key>
<dict>
<key>level-3</key>
<array>
<string>levels/level3.scnassets</string>
<string>textures/level3_tex.png</string>
</array>
</dict>
Apple distinge trei categorii de etichete ODR în funcție de cât timp trebuie păstrată resursa pe dispozitiv. Initial Install Tags se încarcă odată cu aplicația și nu sunt niciodată șterse de sistem. Prefetch Tag Order determină ordinea încărcării de fundal imediat după instalare. Etichetele principale se încarcă la cerere și pot fi șterse de iOS la lipsă de spațiu.
Pe lângă categorii, fiecare etichetă poate avea o prioritate de încărcare. Etichetele cu prioritate ridicată se încarcă înaintea celor cu prioritate scăzută, chiar dacă au fost solicitate mai târziu. Aceasta permite dezvoltatorului să gestioneze ordinea apariției conținutului: mai întâi resursele critice pentru ecranul principal, apoi materialele suplimentare pentru secțiunile profunde ale aplicației.
Configurarea ODR în Xcode include trei etape: categorisirea resurselor pe etichete, configurarea parametrilor de încărcare în Info.plist și implementarea programatică a solicitărilor prin NSBundleResourceRequest. Majoritatea muncii se face în partea de construire a proiectului.
// Verificarea stării și monitorizarea progresului ODR
func monitorODRProgress(tag: String) {
let request = NSBundleResourceRequest(tags: [tag])
let observer = request.progress.observe(\.fractionCompleted) { progress, _ in
DispatchQueue.main.async {
let percent = Int(progress.fractionCompleted * 100)
print("ODR: \(percent)% încărcat")
}
}
}
Progresul încărcării este urmărit prin proprietatea progress a clasei NSProgress cu suport de observare KVO. Aplicația poate afișa un indicator de progres utilizatorului în timpul descărcării resurselor. După finalizarea încărcării, resursele sunt disponibile în pachetul principal al aplicației prin mecanismele standard FileManager și NSDataAsset.
Cotele ODR depind de versiunea iOS. Începând cu iOS 13, dispozitivul poate stoca până la 20 GB de resurse încărcate la cerere pe un cont. Acest volum este distribuit între toate aplicațiile instalate pe dispozitiv „ dacă o aplicație ocupă mult spațiu, altora le rămâne mai puțin.
Monitorizarea spațiului ocupat se face prin NSBundleResourceRequest. Aplicația poate verifica spațiul de stocare ODR disponibil și în funcție de aceasta decide ce resurse să încarce primele. Se recomandă implementarea unui mecanism de fallback: dacă spațiul ODR este plin, să se utilizeze resurse din pachetul principal de calitate redusă.
La depășirea cotei, sistemul șterge resursele cu etichete On-Demand în ordinea celei mai puțin recent utilizate, începând cu cele mai vechi. Resource Manager în codul aplicației poate urmări volumul curent al spațiului ODR ocupat prin proprietatea NSBundleResourceRequest.Dezvoltatorul trebuie să ia în considerare că iOS poate oricând decide ștergerea resurselor On-Demand „ aplicația trebuie să gestioneze corect situația în care o resursă încărcată anterior devine brusc indisponibilă. Se recomandă interceptarea erorilor de acces la resurse și re-solicitarea lor prin beginAccessingResources. Pentru resursele critice fără de care aplicația nu poate funcționa, utilizați Initial Install Tags care nu sunt șterse de sistem.
On-Demand Resources oferă dezvoltatorului un instrument flexibil de gestionare a dimensiunii aplicației, dar impune o serie de limitări legate de disponibilitatea rețelei și politicile de stocare iOS.
Principalul avantaj al ODR „ reducerea radicală a dimensiunii instalării inițiale. Jocurile cu mai multe niveluri, aplicațiile cu conținut video sau seturi mari de imagini pot încărca conținutul porționat. Utilizatorul obține acces la funcționalitatea de bază imediat, iar resursele suplimentare se descarcă în fundal.
ODR necesită conexiune permanentă la internet pentru încărcarea resurselor la prima accesare. Utilizatorul într-o zonă cu acoperire slabă poate întâmpina întârzieri și erori de încărcare. În plus, Apple nu garantează că resursele încărcate vor rămâne pe dispozitiv „ la lipsă de spațiu, iOS poate șterge etichetele On-Demand fără avertisment.
Întrebări frecvente
ODR permite adăugarea și modificarea resurselor fără publicarea unei versiuni noi în App Store. Este suficient să actualizați fișierele pe serverul Apple prin Xcode și să le atribuiți acelorași etichete. La următoarea solicitare, aplicația va primi versiunea actuală a resursei. Acest lucru este convenabil pentru conținut sezonier, promoții temporare și testarea A/B a noilor imagini și machete.
Sistemul șterge resursele cu eticheta On-Demand când trebuie eliberat spațiu pentru alte aplicații. Resursele Initial Install Tags nu sunt șterse. Ordinea de ștergere este determinată de algoritmul LRU (Least Recently Used) „ primele sunt șterse resursele la care nu s-a mai accesat de cel mai mult timp.
Începând cu iOS 13, limita totală a spațiului de stocare ODR este de 20 GB per Apple ID al utilizatorului. Dimensiunea unei etichete nu trebuie să depășească 512 MB pentru performanță optimă de încărcare. La depășirea limitei, solicitările se termină cu eroarea NSBundleResourceRequestLowDiskSpaceError.
Da, după încărcare, resursa este salvată în cache-ul local și disponibilă în modul offline fără conexiune la internet. Problemele apar doar dacă iOS a șters resursa din lipsă de spațiu și utilizatorul încearcă să o acceseze fără rețea.
ODR este integrat cu infrastructura App Store: resursele sunt găzduite pe CDN Apple, gestionate de sistemul de cache și nu necesită organizarea unui server propriu de către dezvoltator. URLSession necesită infrastructură de server, controlul versiunilor și gestionarea manuală a cache-ului. ODR, de asemenea, gestionează automat reluarea încărcării la întreruperea conexiunii.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și