On-Demand Resources „je technologie Apple pro odložené načítání obsahu aplikace”. Místo zahrnutí všech zdrojů do instalačního balíčku je vývojář umístí na servery App Store a vyžádá si je podle potřeby. Podle Apple ODR Guide to umožňuje zmenšit velikost počáteční instalace a přidávat nový obsah bez aktualizace verze aplikace.
Hlavní body
On-Demand Resources (ODR) „je systém správy obsahu integrovaný do iOS, tvOS a macOS”. Umožňuje vývojáři rozdělit zdroje aplikace na povinné (součást instalačního balíčku) a načítatelné na vyžádání (uložené v App Store a stažené podle potřeby).
Systém ODR pracuje se třemi klíčovými entitami: tagy, balíčky zdrojů a požadavky. Tag je identifikační řetězec, který spojuje skupinu souborů. Balíček zdrojů je sada dat spojená s tagem. Požadavek je programové volání NSBundleResourceRequest, které spouští načítání balíčku.
Načítání zdroje prochází několika fázemi: inicializace požadavku s uvedením tagů, kontrola dostupnosti v lokálním úložišti, stažení ze serverů Apple při absenci, upozornění aplikace na připravenost a uvolnění zdroje po použití. Systém automaticky spravuje ukládání do mezipaměti a odstraňování nepoužívaných zdrojů.
| Fáze | Akce systému | Doba provedení |
|---|---|---|
| Inicializace | Vytvoření NSBundleResourceRequest s tagem | Okamžitě |
| Kontrola mezipaměti | Vyhledání zdroje v lokálním úložišti | 0,1–0,5 s |
| Stažení | Stažení z CDN Apple | Závisí na velikosti |
| Upozornění | Volání completion handler nebo delegáta | Okamžitě |
| Uvolnění | Označení zdroje jako odstranitelného systémem | Na vyžádání iOS |
Mechanismus ODR je založen na službě na pozadí, která spravuje požadavky na zdroje z cloudového úložiště App Store. Když aplikace požaduje tag, systém zkontroluje, zda je zdroj v místní mezipaměti. Pokud ne „ spustí stahování prostřednictvím relace URL na pozadí s podporou obnovení při přerušení spojení.
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 kontroluje dostupnost zdroje v mezipaměti bez okamžitého načítání. Pokud je příznak dostupnosti pozitivní „ aplikace pokračuje v práci bez zpoždění. Pokud zdroj chybí, beginAccessingResources spustí stahování s indikací průběhu prostřednictvím vlastnosti progress.
Systém iOS sám spravuje priority načítání zdrojů ODR v závislosti na aktuální aktivitě aplikace. Pokud je aplikace v popředí, načítání probíhá s vysokou prioritou. Na pozadí může iOS načítání zpozdit nebo pozastavit při nízké baterii.
Zdroje ODR mohou zahrnovat obrázky, videa, zvukové soubory, sprity, data úrovní a jakékoli další soubory, které nejsou kritické pro spuštění aplikace. Každý zdroj je vázán na jeden nebo více tagů, které určují jeho příslušnost k funkčnímu bloku.
V Xcode se tagy konfigurují pomocí inspektoru Resource Tags na kartě Target Membership. Vývojář pro každý soubor v projektu určí, zda je součástí hlavního balíčku nebo se načítá prostřednictvím tagu. Jeden soubor může patřit k více tagům, což umožňuje opětovné použití zdrojů mezi různými sekcemi aplikace.
<!-- Příklad konfigurace Resource Tags v 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 rozlišuje tři kategorie tagů ODR podle toho, jak dlouho má být zdroj na zařízení uchováván. Initial Install Tags se načítají spolu s aplikací a systém je nikdy neodstraňuje. Prefetch Tag Order určuje pořadí načítání na pozadí ihned po instalaci. Hlavní tagy se načítají na vyžádání a mohou být odstraněny iOS při nedostatku místa.
Kromě kategorií může mít každý tag prioritu načítání. Tagy s vysokou prioritou se načítají před tagy s nízkou prioritou, i když byly vyžádány později. To umožňuje vývojáři řídit pořadí zobrazení obsahu: nejprve kritické zdroje pro hlavní obrazovku, poté doplňkové materiály pro hluboké sekce aplikace.
Nastavení ODR v Xcode zahrnuje tři fáze: kategorizace zdrojů podle tagů, konfigurace parametrů načítání v Info.plist a programová implementace požadavků prostřednictvím NSBundleResourceRequest. Většina práce se provádí na straně sestavení projektu.
// Kontrola stavu a monitorování průběhu 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)% načteno")
}
}
}
Průběh načítání je sledován prostřednictvím vlastnosti progress třídy NSProgress s podporou pozorování KVO. Aplikace může uživateli zobrazit indikátor průběhu během stahování zdrojů. Po dokončení načítání jsou zdroje k dispozici v hlavním balíčku aplikace prostřednictvím standardních mechanismů FileManager a NSDataAsset.
Kvóty ODR závisí na verzi iOS. Od iOS 13 může zařízení ukládat až 20 GB načtených zdrojů na vyžádání na jeden účet. Tento objem je rozdělen mezi všechny aplikace nainstalované na zařízení „ pokud jedna aplikace zabírá mnoho místa, ostatním zbývá méně.
Sledování obsazeného místa se provádí prostřednictvím NSBundleResourceRequest. Aplikace může zkontrolovat dostupné úložiště ODR a podle toho rozhodnout, které zdroje načíst jako první. Implementace mechanismu fallback se doporučuje: pokud je úložiště ODR plné, použijte zdroje z hlavního balíčku se sníženou kvalitou.
Při překročení kvóty systém odstraňuje zdroje s tagy On-Demand v pořadí podle nejméně nedávného použití, počínaje nejstaršími. Resource Manager v kódu aplikace může sledovat aktuální objem obsazeného úložiště ODR prostřednictvím vlastnosti NSBundleResourceRequest.Vývojář musí vzít v úvahu, že iOS může kdykoli rozhodnout o odstranění zdrojů On-Demand „ aplikace by měla správně zpracovat situaci, kdy dříve načtený zdroj náhle není k dispozici. Doporučuje se zachytávat chyby přístupu ke zdrojům a znovu je vyžadovat prostřednictvím beginAccessingResources. Pro kriticky důležité zdroje, bez kterých aplikace nemůže fungovat, použijte Initial Install Tags, které systém neodstraňuje.
On-Demand Resources poskytují vývojáři flexibilní nástroj pro správu velikosti aplikace, ale ukládají řadu omezení souvisejících s dostupností sítě a politikami úložiště iOS.
Hlavní výhoda ODR „ radikální snížení velikosti počáteční instalace. Hry s několika úrovněmi, aplikace s video obsahem nebo velkými sadami obrázků mohou načítat obsah po částech. Uživatel získá přístup k základní funkcionalitě okamžitě, zatímco další zdroje se stahují na pozadí.
ODR vyžaduje trvalé připojení k internetu pro načítání zdrojů při prvním přístupu. Uživatel v oblasti se špatným pokrytím může narazit na zpoždění a chyby načítání. Kromě toho Apple nezaručuje, že načtené zdroje zůstanou na zařízení „ při nedostatku místa může iOS odstranit tagy On-Demand bez varování.
Často kladené otázky
ODR umožňuje přidávat a měnit zdroje bez publikování nové verze v App Store. Stačí aktualizovat soubory na serveru Apple prostřednictvím Xcode a přiřadit je ke stejným tagům. Při příštím požadavku aplikace obdrží aktuální verzi zdroje. To je vhodné pro sezónní obsah, dočasné promoakce a A/B testování nových obrázků a rozvržení.
Systém odstraňuje zdroje s označením On-Demand, když je potřeba uvolnit místo pro jiné aplikace. Zdroje Initial Install Tags se neodstraňují. Pořadí odstraňování určuje algoritmus LRU (Least Recently Used) „ nejprve se odstraní zdroje, ke kterým se nejdéle nepřistupovalo.
Od iOS 13 je celkový limit úložiště ODR 20 GB na Apple ID uživatele. Velikost jednoho tagu by neměla přesáhnout 512 MB pro optimální výkon načítání. Při překročení limitu požadavky končí chybou NSBundleResourceRequestLowDiskSpaceError.
Ano, po načtení je zdroj uložen v místní mezipaměti a dostupný v offline režimu bez připojení k internetu. Problémy nastávají pouze tehdy, pokud iOS odstranil zdroj kvůli nedostatku místa a uživatel se k němu snaží přistoupit bez sítě.
ODR je integrován s infrastrukturou App Store: zdroje jsou hostovány na CDN Apple, spravovány systémem mezipaměti a nevyžadují od vývojáře organizaci vlastního serveru. URLSession vyžaduje serverovou infrastrukturu, správu verzí a ruční správu mezipaměti. ODR také automaticky zpracovává obnovení stahování při přerušení spojení.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také