On-Demand Resources est la technologie d’Apple pour le chargement différé du contenu de l’application. Au lieu d’inclure toutes les ressources dans le package d’installation, les développeurs les hébergent sur les serveurs de l’App Store et les demandent selon les besoins. Selon Apple ODR Guide, cela réduit la taille de l’installation initiale et permet d’ajouter du nouveau contenu sans mettre à jour la version de l’application.
Points clés
On-Demand Resources (ODR) est un système de gestion de contenu intégré à iOS, tvOS et macOS. Il permet au développeur de diviser les ressources de l’application en obligatoires (incluses dans le package d’installation) et à la demande (stockées dans l’App Store et téléchargées en cas de besoin).
Le système ODR fonctionne avec trois entités principales : les tags, les packs de ressources et les requêtes. Un tag est un identifiant de chaîne qui regroupe un ensemble de fichiers. Un pack de ressources est un ensemble de données associé à un tag. Une requête est un appel programmatique à NSBundleResourceRequest qui initie le chargement du pack.
Le chargement des ressources passe par plusieurs étapes : initialisation de la requête avec les tags spécifiés, vérification de disponibilité dans le stockage local, téléchargement depuis les serveurs Apple si absent, notification à l’application lorsque prêt et libération de la ressource après utilisation. Le système gère automatiquement la mise en cache et la suppression des ressources inutilisées.
| Étape | Action du système | Temps d’exécution |
|---|---|---|
| Initialisation | Création de NSBundleResourceRequest avec un tag | Instantanné |
| Vérification du cache | Recherche de la ressource dans le stockage local | 0,1–0,5 s |
| Téléchargement | Téléchargement depuis le CDN Apple | Dépend de la taille |
| Notification | Appel du gestionnaire d’achèvement ou délégué | Instantanné |
| Libération | Marquage de la ressource comme supprimable par le système | Sur demande d’iOS |
Le mécanisme ODR est basé sur un service d’arrière-plan qui gère les demandes de ressources depuis le stockage cloud de l’App Store. Lorsque l’application demande un tag, le système vérifie si la ressource existe dans le cache local. Si ce n’est pas le cas — il lance le téléchargement via une session URL d’arrière-plan avec prise en charge de la reprise pour les connexions interrompues.
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()
}
}
La méthode conditionallyBeginAccessingResources vérifie la disponibilité de la ressource dans le cache sans chargement immédiat. Si l’indicateur de disponibilité est positif — l’application continue sans délai. Si la ressource est absente, beginAccessingResources lance le téléchargement avec indication de progression via la propriété progress.
iOS gère les priorités de chargement des ressources ODR en fonction de l’activité actuelle de l’application. Lorsque l’application est au premier plan, le chargement est effectué avec une priorité élevée. En arrière-plan, iOS peut retarder le chargement ou le suspendre lorsque la batterie est faible.
Les ressources ODR peuvent inclure des images, des vidéos, des fichiers audio, des sprites, des données de niveaux et tout autre fichier non critique pour le lancement de l’application. Chaque ressource est liée à un ou plusieurs tags qui déterminent son appartenance à un bloc fonctionnel.
Dans Xcode, les tags sont configurés via l’inspecteur Resource Tags dans l’onglet Target Membership. Le développeur spécifie pour chaque fichier du projet s’il est inclus dans le bundle principal ou chargé par tag. Un fichier peut appartenir à plusieurs tags, permettant la réutilisation des ressources dans différentes sections de l’application.
<!-- Exemple de configuration des Resource Tags dans 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 distingue trois catégories de tags ODR en fonction de la durée pendant laquelle une ressource doit rester sur l’appareil. Les tags d’installation initiale sont chargés avec l’application et ne sont jamais supprimés par le système. L’ordre de préchargement des tags détermine la séquence de chargement en arrière-plan immédiatement après l’installation. Les tags principaux sont demandés à la demande et peuvent être supprimés par iOS lorsque l’espace est insuffisant.
En plus des catégories, chaque tag peut avoir une priorité de téléchargement. Les tags avec priorité élevée sont chargés avant ceux à faible priorité, même s’ils ont été demandés plus tard. Cela permet au développeur de contrôler l’ordre d’apparition du contenu : d’abord les ressources critiques pour l’écran principal, puis les matériaux supplémentaires pour les sections profondes de l’application.
La configuration ODR dans Xcode comprend trois étapes : catégorisation des ressources par tags, configuration des paramètres de téléchargement dans Info.plist et implémentation programmatique des requêtes via NSBundleResourceRequest. La majeure partie du travail est effectuée côté build.
// Vérification du statut et suivi de la progression 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)% chargé")
}
}
}
La progression du téléchargement est suivie via la propriété progress de la classe NSProgress avec prise en charge de l’observation KVO. L’application peut afficher un indicateur de chargement à l’utilisateur pendant le téléchargement des ressources. Une fois le téléchargement terminé, les ressources sont disponibles dans le bundle principal de l’application via les mécanismes standard FileManager et NSDataAsset.
Les quotas ODR dépendent de la version d’iOS. À partir d’iOS 13, un appareil peut stocker jusqu’à 20 Go de ressources à la demande par compte. Cet espace est partagé entre toutes les applications installées sur l’appareil — si une application occupe beaucoup d’espace, il en reste moins pour les autres.
La surveillance de l’espace utilisé se fait via NSBundleResourceRequest. L’application peut vérifier le stockage ODR disponible et décider en conséquence quelles ressources charger en premier. Il est recommandé d’implémenter un mécanisme de repli : si le stockage ODR est plein, utilisez des ressources de qualité réduite provenant du bundle principal.
Lorsque le quota est dépassé, le système supprime les ressources avec des tags à la demande dans l’ordre du moins récemment utilisé, en commençant par les plus anciennes. Le gestionnaire de ressources dans le code de l’application peut suivre l’utilisation actuelle du stockage ODR via la propriété NSBundleResourceRequest.Les développeurs doivent considérer qu’iOS peut décider à tout moment de supprimer les ressources à la demande — l’application doit gérer correctement les situations où une ressource précédemment chargée devient soudainement indisponible. Il est recommandé d’intercepter les erreurs d’accès aux ressources et de les redemander via beginAccessingResources. Pour les ressources critiques sans lesquelles l’application ne peut pas fonctionner, utilisez des tags d’installation initiale qui ne sont pas supprimés par le système.
On-Demand Resources offrent au développeur un outil flexible pour gérer la taille de l’application, mais imposent un certain nombre de limitations liées à la disponibilité du réseau et aux politiques de stockage d’iOS.
Le principal avantage de l’ODR est la réduction radicale de la taille de l’installation initiale. Les jeux à plusieurs niveaux, les applications avec contenu vidéo ou de grands ensembles d’images peuvent charger le contenu par portions. L’utilisateur accède immédiatement aux fonctionnalités de base, tandis que les ressources supplémentaires sont téléchargées en arrière-plan.
L’ODR nécessite une connexion Internet constante pour charger les ressources lors du premier accès. Les utilisateurs dans les zones à faible couverture peuvent rencontrer des retards et des erreurs de téléchargement. De plus, Apple ne garantit pas que les ressources téléchargées restent sur l’appareil — lorsque l’espace est insuffisant, iOS peut supprimer les tags à la demande sans préavis.
Questions fréquentes
ODR permet d’ajouter et de modifier des ressources sans publier une nouvelle version sur l’App Store. Il suffit de mettre à jour les fichiers sur le serveur Apple via Xcode et de les assigner aux mêmes tags. Lors de la prochaine demande, l’application recevra la version la plus récente de la ressource. C’est pratique pour le contenu saisonnier, les promotions temporaires et les tests A/B de nouvelles images et maquettes.
Le système supprime les ressources avec des tags à la demande lorsqu’il doit libérer de l’espace pour d’autres applications. Les ressources des tags d’installation initiale ne sont pas supprimées. L’ordre de suppression est déterminé par l’algorithme LRU (Least Recently Used) — les premières à être supprimées sont les ressources qui n’ont pas été consultées depuis le plus longtemps.
Depuis iOS 13, la limite totale de stockage ODR est de 20 Go par utilisateur Apple ID. La taille d’un seul tag ne doit pas dépasser 512 Mo pour des performances de téléchargement optimales. Lorsque la limite est dépassée, les requêtes échouent avec NSBundleResourceRequestLowDiskSpaceError.
Oui, après le téléchargement, la ressource est sauvegardée dans le cache local et disponible en mode hors ligne sans connexion Internet. Les problèmes surviennent uniquement si iOS a supprimé la ressource en raison d’un manque d’espace et que l’utilisateur tente d’y accéder sans réseau.
ODR est intégré à l’infrastructure de l’App Store : les ressources sont hébergées sur le CDN d’Apple, gérées par le système de cache et ne nécessitent pas que le développeur configure son propre serveur. URLSession nécessite une infrastructure serveur, un contrôle de version et une gestion manuelle du cache. ODR gère également automatiquement la reprise du téléchargement en cas d’interruption de connexion.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi