On-Demand Resources „is Apple's technologie voor het uitgesteld laden van app-content”. In plaats van alle resources in het installatiepakket op te nemen, plaatst de ontwikkelaar ze op App Store-servers en vraagt ze aan wanneer nodig. Volgens Apple ODR Guide verkleint dit de initiële installatiegrootte en voegt nieuwe content toe zonder de app-versie bij te werken.
Belangrijkste punten
On-Demand Resources (ODR) „is een contentbeheersysteem ingebouwd in iOS, tvOS en macOS”. Het stelt de ontwikkelaar in staat om app-resources te verdelen in verplichte (onderdeel van het installatiepakket) en op aanvraag laadbare (opgeslagen in de App Store en gedownload wanneer nodig).
Het ODR-systeem werkt met drie belangrijke entiteiten: tags, resourcepakketten en aanvragen. Een tag is een identificerende string die een groep bestanden verenigt. Een resourcepakket is een set gegevens die aan een tag is gekoppeld. Een aanvraag is een programmatische aanroep van NSBundleResourceRequest die het laden van het pakket start.
Het laden van een resource doorloopt verschillende fasen: initialisatie van de aanvraag met specificatie van tags, controle op beschikbaarheid in lokale opslag, downloaden van Apple-servers bij afwezigheid, melding aan de app over gereedheid en vrijgave van de resource na gebruik. Het systeem beheert automatisch caching en verwijdering van ongebruikte resources.
| Fase | Systeemactie | Uitvoeringstijd |
|---|---|---|
| Initialisatie | Aanmaken van NSBundleResourceRequest met tag | Direct |
| Cachecontrole | Zoeken naar resource in lokale opslag | 0,1–0,5 s |
| Downloaden | Ophalen van Apple CDN | Afhankelijk van grootte |
| Melding | Aanroepen van completion handler of delegraat | Direct |
| Vrijgave | Markeren van resource als verwijderbaar door systeem | Op verzoek van iOS |
Het ODR-mechanisme is gebaseerd op een achtergronddienst die resourceaanvragen vanuit de App Store-cloud beheert. Wanneer de app een tag aanvraagt, controleert het systeem of de resource in de lokale cache aanwezig is. Zo niet „ start het downloaden via een achtergrond-URL-sessie met ondersteuning voor hervatting bij verbindingsonderbreking.
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()
}
}
De methode conditionallyBeginAccessingResources controleert de beschikbaarheid van de resource in de cache zonder onmiddellijk te laden. Als de beschikbaarheidsvlag positief is „ gaat de app zonder vertraging verder. Als de resource ontbreekt, start beginAccessingResources het downloaden met voortgangsindicatie via de eigenschap progress.
Het iOS-systeem beheert zelf de prioriteiten van het laden van ODR-resources op basis van de huidige activiteit van de app. Als de app op de voorgrond staat, wordt geladen met hoge prioriteit. Op de achtergrond kan iOS het laden uitstellen of pauzeren bij een lage batterij.
ODR-resources kunnen afbeeldingen, video's, audiobestanden, sprites, niveaugegevens en alle andere bestanden omvatten die niet kritiek zijn voor het starten van de app. Elke resource is gekoppeld aan een of meer tags die de functionele bloktoewijzing bepalen.
In Xcode worden tags geconfigureerd via de inspector Resource Tags op het tabblad Target Membership. De ontwikkelaar specificeert voor elk bestand in het project of het deel uitmaakt van de hoofd-bundle of via een tag wordt geladen. Eén bestand kan tot meerdere tags behoren, wat hergebruik van resources tussen verschillende secties van de app mogelijk maakt.
<!-- Voorbeeldconfiguratie van Resource Tags in 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 onderscheidt drie categorieën ODR-tags op basis van hoe lang de resource op het apparaat moet worden bewaard. Initial Install Tags worden samen met de app geladen en nooit door het systeem verwijderd. Prefetch Tag Order bepaalt de volgorde van achtergrond laden direct na installatie. Hoofdtags worden op aanvraag geladen en kunnen door iOS worden verwijderd bij ruimtegebrek.
Naast categorieën kan elke tag een laadprioriteit hebben. Tags met hoge prioriteit worden eerder geladen dan tags met lage prioriteit, zelfs als ze later zijn aangevraagd. Dit stelt de ontwikkelaar in staat de volgorde van contentweergave te beheren: eerst kritieke resources voor het hoofdscherm, daarna aanvullend materiaal voor diepe secties van de app.
ODR configureren in Xcode omvat drie stappen: categoriseren van resources per tag, configureren van laadparameters in Info.plist en programmatische implementatie van aanvragen via NSBundleResourceRequest. Het meeste werk wordt aan de projectbuild-kant gedaan.
// Statuscontrole en monitoring van ODR-voortgang
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)% geladen")
}
}
}
Voortgang van laden wordt gevolgd via de eigenschap progress van de klasse NSProgress met ondersteuning voor KVO-bewaking. De app kan een voortgangsindicator aan de gebruiker tonen tijdens het downloaden van resources. Na voltooiing van het laden zijn de resources beschikbaar in de hoofd-bundle van de app via de standaardmechanismen FileManager en NSDataAsset.
ODR-quota zijn afhankelijk van de iOS-versie. Vanaf iOS 13 kan het apparaat tot 20 GB aan op aanvraag geladen resources per account opslaan. Dit volume wordt verdeeld over alle apps die op het apparaat zijn geïnstalleerd „ als één app veel ruimte inneemt, blijft er minder over voor anderen.
Monitoring van gebruikte ruimte gebeurt via NSBundleResourceRequest. De app kan de beschikbare ODR-opslag controleren en op basis daarvan beslissen welke resources eerst worden geladen. Implementatie van een fallback-mechanisme wordt aanbevolen: als de ODR-opslag vol is, gebruik dan resources van verminderde kwaliteit uit de hoofd-bundle.
Bij overschrijding van het quota verwijdert het systeem resources met On-Demand-tags in de volgorde van minst recent gebruikt, te beginnen met de oudste. Resource Manager in de app-code kan het huidige volume van gebruikte ODR-opslag volgen via de eigenschap NSBundleResourceRequest.De ontwikkelaar moet er rekening mee houden dat iOS op elk moment kan besluiten On-Demand-resources te verwijderen „ de app moet de situatie correct afhandelen waarin een eerder geladen resource plotseling niet beschikbaar is. Het wordt aanbevolen om fouten bij toegang tot resources op te vangen en opnieuw aan te vragen via beginAccessingResources. Gebruik voor kritieke resources zonder welke de app niet kan functioneren Initial Install Tags, die niet door het systeem worden verwijderd.
On-Demand Resources bieden de ontwikkelaar een flexibel hulpmiddel voor het beheren van de app-grootte, maar leggen een aantal beperkingen op met betrekking tot netwerkbeschikbaarheid en iOS-opslagbeleid.
Het belangrijkste voordeel van ODR „ drastische vermindering van de initiële installatiegrootte. Games met meerdere niveaus, apps met video-content of grote afbeeldingssets kunnen content in porties laden. De gebruiker krijgt direct toegang tot basisfunctionaliteit, terwijl extra resources op de achtergrond worden gedownload.
ODR vereist een constante internetverbinding voor het laden van resources bij het eerste bezoek. Een gebruiker in een gebied met slechte dekking kan vertragingen en laadfouten ondervinden. Bovendien garandeert Apple niet dat geladen resources op het apparaat blijven „ bij ruimtegebrek kan iOS On-Demand-tags zonder waarschuwing verwijderen.
Veelgestelde vragen
ODR maakt het mogelijk resources toe te voegen en te wijzigen zonder een nieuwe versie in de App Store te publiceren. Het volstaat om de bestanden op de Apple-server via Xcode bij te werken en ze aan dezelfde tags toe te wijzen. Bij de volgende aanvraag ontvangt de app de huidige versie van de resource. Dit is handig voor seizoenscontent, tijdelijke promoties en A/B-testen van nieuwe afbeeldingen en lay-outs.
Het systeem verwijdert resources met de On-Demand-markering wanneer ruimte moet worden vrijgemaakt voor andere apps. Initial Install Tags-resources worden niet verwijderd. De verwijderingsvolgorde wordt bepaald door het LRU (Least Recently Used)-algoritme „ eerst worden resources verwijderd die het langst niet zijn gebruikt.
Vanaf iOS 13 is de totale ODR-opslaglimiet 20 GB per Apple ID van de gebruiker. De grootte van één tag mag niet groter zijn dan 512 MB voor optimale laadprestaties. Bij overschrijding van de limiet mislukken aanvragen met de fout NSBundleResourceRequestLowDiskSpaceError.
Ja, na het laden wordt de resource opgeslagen in de lokale cache en beschikbaar in offline modus zonder internetverbinding. Problemen ontstaan alleen als iOS de resource heeft verwijderd vanwege ruimtegebrek en de gebruiker deze zonder netwerk probeert te openen.
ODR is geïntegreerd met de App Store-infrastructuur: resources worden gehost op Apple CDN, beheerd door het cachesysteem en vereisen geen eigen server van de ontwikkelaar. URLSession vereist serverinfrastructuur, versiebeheer en handmatig cachebeheer. ODR beheert ook automatisch het hervatten van downloads bij verbindingsonderbreking.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook