On-Demand Resources ist Apples Technologie zum verzögerten Laden von App-Inhalten. Anstatt alle Ressourcen in das Installationspaket aufzunehmen, hosten Entwickler sie auf App Store-Servern und fordern sie bei Bedarf an. Laut Apple ODR Guide reduziert dies die anfängliche Installationsgröße und ermöglicht das Hinzufügen neuer Inhalte ohne Aktualisierung der App-Version.
Wichtige Punkte
On-Demand Resources (ODR) ist ein in iOS, tvOS und macOS integriertes Content-Management-System. Es ermöglicht dem Entwickler, App-Ressourcen in obligatorische (im Installationspaket enthalten) und auf Abruf (im App Store gespeichert und bei Bedarf heruntergeladen) zu unterteilen.
Das ODR-System arbeitet mit drei Hauptentitäten: Tags, Ressourcenpaketen und Anfragen. Ein Tag ist ein String-Identifikator, der eine Gruppe von Dateien zusammenfasst. Ein Ressourcenpaket ist ein mit einem Tag verbundener Datensatz. Eine Anfrage ist ein programmatischer Aufruf von NSBundleResourceRequest, der das Laden des Pakets initiiert.
Das Laden von Ressourcen durchläuft mehrere Phasen: Initialisierung der Anfrage mit angegebenen Tags, Prüfung der Verfügbarkeit im lokalen Speicher, Herunterladen von Apple-Servern bei Abwesenheit, Benachrichtigung der App bei Bereitschaft und Freigabe der Ressource nach der Nutzung. Das System verwaltet automatisch das Caching und die Entfernung ungenutzter Ressourcen.
| Phase | Systemaktion | Ausführungszeit |
|---|---|---|
| Initialisierung | Erstellen von NSBundleResourceRequest mit einem Tag | Sofort |
| Cache-Prüfung | Suche nach Ressource im lokalen Speicher | 0,1–0,5 s |
| Download | Herunterladen von Apple CDN | Abhängig von der Größe |
| Benachrichtigung | Aufruf des Completion Handlers oder Delegaten | Sofort |
| Freigabe | Ressource als vom System entfernbar markieren | Auf Anfrage von iOS |
Der ODR-Mechanismus basiert auf einem Hintergrunddienst, der Ressourcenanfragen aus dem Cloud-Speicher des App Store verwaltet. Wenn die App ein Tag anfordert, prüft das System, ob die Ressource im lokalen Cache vorhanden ist. Wenn nicht — startet es den Download über eine Hintergrund-URL-Session mit Unterstützung zur Wiederaufnahme bei unterbrochenen Verbindungen.
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()
}
}
Die Methode conditionallyBeginAccessingResources prüft die Verfügbarkeit der Ressource im Cache ohne sofortiges Laden. Wenn das Verfügbarkeitsflag positiv ist — setzt die App ohne Verzögerung fort. Wenn die Ressource fehlt, startet beginAccessingResources den Download mit Fortschrittsanzeige über die Eigenschaft progress.
iOS verwaltet die Prioritäten des ODR-Ressourcenladens basierend auf der aktuellen App-Aktivität. Wenn die App im Vordergrund ist, wird das Laden mit hoher Priorität durchgeführt. Im Hintergrund kann iOS das Laden bei niedrigem Akkustand verzögern oder anhalten.
ODR-Ressourcen können Bilder, Videos, Audiodateien, Sprites, Leveldaten und alle anderen Dateien umfassen, die für den App-Start nicht kritisch sind. Jede Ressource ist mit einem oder mehreren Tags verbunden, die ihre Zugehörigkeit zu einem funktionalen Block bestimmen.
In Xcode werden Tags über den Resource Tags-Inspektor auf dem Tab Target Membership konfiguriert. Der Entwickler gibt für jede Projektdatei an, ob sie im Hauptbundle enthalten oder per Tag geladen wird. Eine Datei kann mehreren Tags angehören, was die Wiederverwendung von Ressourcen in verschiedenen App-Bereichen ermöglicht.
<!-- Beispiel für die Konfiguration von 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 unterscheidet drei ODR-Tag-Kategorien basierend darauf, wie lange eine Ressource auf dem Gerät verbleiben soll. Initial Install Tags werden mit der App geladen und niemals vom System gelöscht. Die Prefetch Tag Order bestimmt die Reihenfolge des Hintergrund-Vorladens unmittelbar nach der Installation. Haupt-Tags werden auf Abruf angefordert und können von iOS bei Speichermangel gelöscht werden.
Zusätzlich zu den Kategorien kann jedes Tag eine Download-Priorität haben. Tags mit hoher Priorität werden vor niedrigprioren Tags geladen, selbst wenn sie später angefordert wurden. Dies ermöglicht dem Entwickler, die Reihenfolge des Erscheinens von Inhalten zu steuern: zunächst kritische Ressourcen für den Hauptbildschirm, dann zusätzliche Materialien für tiefere App-Bereiche.
ODR-Setup in Xcode umfasst drei Phasen: Kategorisierung von Ressourcen nach Tags, Konfiguration der Download-Parameter in Info.plist und programmatische Implementierung von Anfragen über NSBundleResourceRequest. Der Großteil der Arbeit erfolgt auf der Build-Seite.
// Überprüfung des ODR-Status und Überwachung des Fortschritts
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")
}
}
}
Der Download-Fortschritt wird über die progress-Eigenschaft der NSProgress-Klasse mit KVO-Beobachtungsunterstützung verfolgt. Die App kann dem Benutzer während des Downloads einen Ladeindikator anzeigen. Nach Abschluss des Downloads sind die Ressourcen über die standardmäßigen FileManager- und NSDataAsset-Mechanismen im Haupt-App-Bundle verfügbar.
ODR-Kontingente hängen von der iOS-Version ab. Ab iOS 13 kann ein Gerät bis zu 20 GB an On-Demand-Ressourcen pro Konto speichern. Dieser Speicherplatz wird von allen auf dem Gerät installierten Apps gemeinsam genutzt — wenn eine App viel Platz beansprucht, bleibt weniger für andere übrig.
Die Überwachung des belegten Speicherplatzes erfolgt über NSBundleResourceRequest. Die App kann den verfügbaren ODR-Speicher überprüfen und entsprechend entscheiden, welche Ressourcen zuerst geladen werden sollen. Es wird empfohlen, einen Fallback-Mechanismus zu implementieren: Wenn der ODR-Speicher voll ist, verwenden Sie Ressourcen in reduzierter Qualität aus dem Hauptbundle.
Wenn das Kontingent überschritten wird, entfernt das System die On-Demand-getaggten Ressourcen in der Reihenfolge der geringsten letzten Nutzung, beginnend mit den ältesten. Der Ressourcen-Manager im App-Code kann die aktuelle ODR-Speichernutzung über die NSBundleResourceRequest-Eigenschaft verfolgen.Entwickler müssen berücksichtigen, dass iOS jederzeit entscheiden kann, On-Demand-Ressourcen zu löschen — die App muss Situationen korrekt behandeln, in denen eine zuvor geladene Ressource plötzlich nicht mehr verfügbar ist. Es wird empfohlen, Ressourcenzugriffsfehler abzufangen und erneut über beginAccessingResources anzufordern. Für kritische Ressourcen, ohne die die App nicht funktionieren kann, verwenden Sie Initial Install Tags, die nicht vom System entfernt werden.
On-Demand Resources bieten Entwicklern ein flexibles Werkzeug zur Verwaltung der App-Größe, bringen jedoch eine Reihe von Einschränkungen in Bezug auf Netzwerkverfügbarkeit und iOS-Speicherrichtlinien mit sich.
Der Hauptvorteil von ODR ist die drastische Reduzierung der anfänglichen Installationsgröße. Spiele mit mehreren Levels, Apps mit Videoinhalten oder großen Bildersammlungen können Inhalte portionsweise laden. Der Benutzer erhält sofort Zugriff auf die Basisfunktionalität, während zusätzliche Ressourcen im Hintergrund heruntergeladen werden.
ODR erfordert eine ständige Internetverbindung zum Laden von Ressourcen beim ersten Zugriff. Benutzer in Gebieten mit schlechter Abdeckung können Verzögerungen und Download-Fehlern ausgesetzt sein. Darüber hinaus garantiert Apple nicht, dass heruntergeladene Ressourcen auf dem Gerät verbleiben — bei Speichermangel kann iOS On-Demand-Tags ohne Vorwarnung löschen.
Häufig gestellte Fragen
ODR ermöglicht das Hinzufügen und Ändern von Ressourcen, ohne eine neue Version im App Store zu veröffentlichen. Aktualisieren Sie einfach die Dateien auf dem Apple-Server über Xcode und weisen Sie sie denselben Tags zu. Bei der nächsten Anfrage erhält die App die neueste Version der Ressource. Dies ist praktisch für saisonale Inhalte, zeitlich begrenzte Aktionen und A/B-Tests neuer Bilder und Layouts.
Das System löscht On-Demand-getaggte Ressourcen, wenn es Speicherplatz für andere Apps freigeben muss. Ressourcen von Initial Install Tags werden nicht gelöscht. Die Löschreihenfolge wird durch den LRU (Least Recently Used)-Algorithmus bestimmt — zuerst werden die Ressourcen gelöscht, auf die am längsten nicht zugegriffen wurde.
Seit iOS 13 beträgt das gesamte ODR-Speicherlimit 20 GB pro Apple-ID-Benutzer. Die Größe eines einzelnen Tags sollte 512 MB nicht überschreiten, um eine optimale Download-Leistung zu gewährleisten. Bei Überschreitung des Limits schlagen Anfragen mit NSBundleResourceRequestLowDiskSpaceError fehl.
Ja, nach dem Herunterladen wird die Ressource im lokalen Cache gespeichert und ist im Offline-Modus ohne Internetverbindung verfügbar. Probleme treten nur auf, wenn iOS die Ressource aufgrund von Speichermangel gelöscht hat und der Benutzer versucht, ohne Netzwerk darauf zuzugreifen.
ODR ist in die App Store-Infrastruktur integriert: Ressourcen werden auf Apples CDN gehostet, vom Caching-System verwaltet und erfordern keinen eigenen Server. URLSession erfordert Serverinfrastruktur, Versionskontrolle und manuelles Caching. ODR behandelt auch automatisch die Wiederaufnahme von Downloads bei Verbindungsunterbrechungen.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch