On Demand Resources est déprécié : ce que coûte Background Assets
Apple a mis à la retraite un système de distribution de contenu vieux de dix ans en 13 mots : « On Demand Resources and the NSBundleResourceRequest API are deprecated. Use Background Assets instead. »1
Cette phrase constitue l’entrée complète. Elle porte le radar 170066290, figure sous Deprecations et se répète mot pour mot dans trois notes de version distinctes.123 Apple n’a publié aucune version de suppression, aucun guide de migration rattaché à la dépréciation, ni la moindre note équivalente dans les notes de version macOS ou watchOS.
Le travail se cache dans les quatre derniers mots. Background Assets n’est pas une chose unique. Le framework se scinde en trois configurations aux modèles d’hébergement différents, aux cibles de déploiement minimales différentes et aux coûts de migration séparés par environ un ordre de grandeur. Le choix se joue avant la première ligne de code, et se tromper là revient cher.
En bref
- Apple a déprécié On Demand Resources et
NSBundleResourceRequestdans les notes de version iOS et iPadOS 27, tvOS 27 et visionOS 27.123 ODR continue de fonctionner. Apple n’a annoncé aucune date de suppression, et les API dépréciées sont toujours livrées et résolvent toujours les tags. - Les données de disponibilité de l’API elle-même la déprécient sur six plateformes, soit deux de plus que l’ensemble des notes de version n’en mentionne : Mac Catalyst et watchOS.4 Background Assets ne publie aucune disponibilité watchOS, si bien que watchOS reçoit une dépréciation sans remplacement documenté.56
- « Use Background Assets instead » se scinde en trois : gérée avec hébergement Apple, gérée avec votre propre hébergement, et non gérée. Les deux voies gérées exigent iOS 26.0 comme cible de déploiement minimale.78 En dessous de 26.0, seule la voie non gérée reste ouverte, et elle vous impose d’héberger les fichiers, d’inventer le format de manifeste et de l’analyser vous-même.9
- La gestion du disque s’inverse. ODR laissait le système purger les ressources taguées inutilisées et traitait
setPreservationPriority(_:forTags:)comme une indication sur l’ordre de purge.410 Background Assets conserve sur l’appareil chaque pack téléchargé jusqu’à ce que votre code appelleremove(assetPackWithID:).11 - Apple héberge jusqu’à 200 Go de packs d’assets compressés et jusqu’à 200 packs par fiche d’app, partagés entre toutes les plateformes que votre app propose, chargés sur App Store Connect et examinés séparément des builds.1213
Ce qu’Apple a déprécié, précisément
Trois détails de la note pèsent lourd, et la note n’en énonce aucun.
La portée dépasse celle des notes de version. Trois documents portent l’entrée : iOS et iPadOS 27, tvOS 27 et visionOS 27, chacun sous un titre On Demand Resources assorti d’un sous-titre Deprecations, chacun citant le même radar.123 Les notes macOS 27 et watchOS 27 n’en disent rien.
L’annotation de disponibilité de l’API raconte une histoire plus large. NSBundleResourceRequest est indiquée comme introduite dans iOS 9.0 et dépréciée en 27.0, avec la même dépréciation 27.0 sur iPadOS 9.0, Mac Catalyst 13.1, tvOS 9.0, visionOS 1.0 et watchOS 2.0.4 Six plateformes dans les métadonnées, quatre nommées dans l’ensemble des notes. Les deux méthodes de priorité de préservation de Bundle portent la même annotation à six plateformes.10 Un audit mené à partir des seules notes de version passe entièrement à côté des entrées Mac Catalyst et watchOS.
L’entrée Mac Catalyst est nominale. Apple documente que NSBundleResourceRequest « ignores calls from Mac apps built with Mac Catalyst » : la dépréciation retire donc une API qui n’y a jamais rien fait.4 L’entrée watchOS, elle, ne l’est pas. Background Assets annonce une disponibilité pour iOS 16.0, iPadOS 16.0, Mac Catalyst 16.0, macOS 13.0, tvOS 18.4 et visionOS 2.4, sans aucune ligne watchOS.5 Apple indique clairement que les packs d’assets hébergés par Apple sont « available for apps distributed through the App Store on all platforms except watchOS ».6 Une app watchOS qui utilise ODR récolte un avertissement de dépréciation et aucun remplacement vers lequel migrer.
C’est la contrainte la plus faible des trois changements du cycle 27 que j’ai couverts. Déprécié veut dire déprécié. Apple n’a publié aucune version de suppression, aucun verrou à la soumission, aucun échec à l’exécution. Comparez avec l’obligation du cycle de vie des scènes du même cycle, où les apps compilées avec le nouveau SDK « fail to launch », ou avec l’exigence d’écran de lancement, où l’App Store rejette purement et simplement le build. ODR ne fait ni l’un ni l’autre. Les tags existants continuent de se résoudre, les appels existants continuent de renvoyer des ressources, et les binaires déjà livrés continuent de fonctionner. Ce qui arrive, c’est un avertissement du compilateur et une horloge que personne ne peut lire.
Le calendrier se lit comme une décision, pas comme un nettoyage. Apple a déprécié l’API sur quatre noms de plateformes d’un coup, une version après la sortie du niveau géré de son remplacement. Considérez cette dépréciation comme l’ouverture d’une fenêtre de migration dont Apple n’a pas publié la durée, et non comme une urgence.
Le choix qui précède l’écriture du code
La présentation du framework par Apple décrit deux modèles d’hébergement et un mode géré par défaut qui « handles downloads, updates, compression, and more for you ». Pour l’hébergement Apple, « you upload your assets to App Store Connect and maintain them there, similar to app builds ».5 Le modèle d’extension Background Download de Xcode nomme directement deux types : le type géré et hébergé par Apple, et le type auto-hébergé et non géré.911 Une troisième combinaison existe dans les clés de la liste de propriétés : BAHasManagedAssetPacks réglée sur YES sans BAUsesAppleHosting sélectionne des packs d’assets gérés que vous hébergez vous-même, et sa documentation vous oriente vers le protocole ManagedDownloaderExtension plutôt que vers StoreDownloaderExtension de StoreKit.7814
| Gérée, hébergée par Apple | Gérée, auto-hébergée | Non gérée, auto-hébergée | |
|---|---|---|---|
| iOS minimum | 26.0715 | 26.0714 | 16.19 |
| Qui héberge les fichiers | Apple, via App Store Connect6 | Vous | Vous |
| Format de manifeste | Le schéma JSON d’Apple11 | Le schéma JSON d’Apple11 | À vous de l’inventer et de l’analyser9 |
| Protocole d’extension | StoreDownloaderExtension716 |
ManagedDownloaderExtension714 |
BADownloaderExtension9 |
| Téléchargements, mises à jour, compression | Le système5 | Le système5 | Vous9 |
| Clés de liste de propriétés | 311 | Non documentées de bout en bout7 | 4 de premier niveau, dont une en contenant 3 autres9 |
Pour la plupart des équipes, c’est la cible de déploiement qui tranche. Chaque point d’entrée géré exige au moins iOS 26.0, depuis AssetPackManager et ManagedDownloaderExtension jusqu’aux trois clés de liste de propriétés.781415 Une app qui prend en charge iOS 18 ne peut pas adopter le niveau géré du tout : ses options se réduisent à la voie non gérée, qui remonte jusqu’à iOS 16.1, ou au maintien d’ODR déprécié jusqu’à ce que la cible de déploiement bouge.9
La voie non gérée, c’est un autre métier. Dans la séquence d’Apple, le système télécharge un manifeste depuis BAManifestURL avant le lancement de votre app, transmet le fichier à votre extension et récupère un ensemble de requêtes de téléchargement.9 Apple énonce le partage des rôles sans détour : « It’s your responsibility to create manifest files for your self-hosted, unmanaged assets (using your format of choice) that your code parses to get the URLs and file sizes to the system. »9 Vous fournissez l’hébergement, un CDN, un schéma de manifeste, un analyseur et une liste d’autorisation de domaines. Quiconque lit « use Background Assets instead » comme un simple échange d’API lit le niveau géré et cite la facture du non géré.
Ce qu’ODR vous donnait et que vous reconstruisez à la main
Trois comportements d’ODR n’ont aucun équivalent direct.
Les tags deviennent des packs d’assets. ODR identifiait le contenu par des tags textuels attribués dans Xcode, et NSBundleResourceRequest(tags:) en réclamait un ou plusieurs.4 Background Assets remplace les tags par des packs d’assets : des répertoires de fichiers décrits par un manifeste JSON, compressés en archive .aar par un outil en ligne de commande. L’unité de granularité grossit, et l’attribution quitte le catalogue d’assets de Xcode pour un fichier que vous maintenez.
L’hébergement Apple devient un cycle de livraison distinct. Le contenu ODR voyageait avec le build. Les packs d’assets hébergés par Apple se chargent indépendamment via Transporter, altool, iTMSTransporter ou l’API App Store Connect, et vous les soumettez à l’App Review séparément de l’app.1113 Le découplage est justement l’intérêt : vous livrez du contenu neuf sans livrer de build. Le prix, c’est une deuxième chaîne de soumission, une deuxième file d’examen et un deuxième jeu de statuts à surveiller.
La purge automatique devient votre affaire, et cette inversion est le changement le plus tranchant. ODR traitait le contenu téléchargé comme un cache appartenant au système. Apple documentait que le système « will not attempt to purge the resources marked with a tag from on-device storage as long as at least one NSBundleResourceRequest object is managing the tag », ce qui est une promesse sur le moment de la purge, pas sur son existence.4 setPreservationPriority(_:forTags:) existait précisément pour donner « a hint to the system of the relative order for purging tagged sets of resources in the bundle ».10 Vous mettiez fin à votre réclamation, le système récupérait l’espace à son propre rythme, et la gestion du stockage saturé était le problème d’Apple.
Background Assets renverse la propriété. Le système maintient les packs à jour automatiquement, et checkForUpdates() supprime ceux devenus obsolètes sur le serveur.15 Ni l’un ni l’autre n’évince un pack dont vous avez simplement fini de vous servir. La consigne d’Apple est explicite : « the system won’t automatically remove your asset packs while your app is installed. Therefore, when you are done with an asset pack, call the remove(assetPackWithID:) method. »11
Le motif à portée limitée, avec comptage de références, s’effondre en une suppression explicite que vous devez décider d’appeler :
// ODR: claim a tag, use the file, release the claim.
// The system reclaims the space afterward on its own schedule.
let request = NSBundleResourceRequest(tags: ["Tutorial"])
try await request.beginAccessingResources()
let url = Bundle.main.url(forResource: "Introduction", withExtension: "m4v")
request.endAccessingResources()
import System // url(for:) and contents(at:) take a FilePath
// Background Assets: ensure the pack, read the file, delete the pack.
// Nothing reclaims the space if you skip the last line.
let manager = AssetPackManager.shared
guard let pack = try await manager.manifest.assetPack(withID: "Tutorial") else { return }
try await manager.ensureLocalAvailability(of: pack, requireLatestVersion: false)
let url = try manager.url(for: "Videos/Introduction.m4v")
try await manager.remove(assetPackWithID: "Tutorial")
Toute app qui repose sur l’hypothèse d’éviction d’ODR a besoin d’une politique de stockage écrite pour elle. Le mode de défaillance est silencieux : rien ne plante, rien n’alerte, et le stockage de l’appareil grimpe jusqu’à ce qu’un utilisateur repère votre app dans la liste du stockage.
La surface de migration, point par point
Pour la voie gérée hébergée par Apple, les étapes d’Apple elles-mêmes donnent cette liste de contrôle.
Regroupez les fichiers en packs d’assets et choisissez une politique de téléchargement par pack. Il en existe trois. essential télécharge pendant l’installation et alimente la progression que les gens regardent dans l’App Store, dans TestFlight et sur l’écran d’accueil. prefetch démarre pendant l’installation et se poursuit en arrière-plan une fois celle-ci terminée. onDemand ne télécharge que lorsque votre code le demande.11 Pour essential et prefetch, un tableau imbriqué installationEventTypes accepte firstInstallation, subsequentUpdate, ou les deux : un pack de tutoriel peut ainsi se télécharger à la première installation et se dispenser de toutes les mises à jour ultérieures.11
Écrivez un manifeste par pack. Xcode génère un modèle annoté :
xcrun ba-package template -o Manifest.json
{
"assetPackID": "Tutorial",
"downloadPolicy": {
"essential": {
"installationEventTypes": ["firstInstallation"]
}
},
"fileSelectors": [
{ "file": "Videos/Introduction.m4v" },
{ "directory": "Textures/Tutorial" }
],
"platforms": ["<identifiers from the generated template comments>"]
}
Les chemins de fichiers se résolvent relativement au répertoire depuis lequel vous lancez la commande d’empaquetage, ce qui compte de nouveau plus tard, au moment de relire les fichiers par chemin.11 Archivez chaque pack :
xcrun ba-package Manifest.json -o Tutorial.aar
Ajoutez une cible d’extension Background Download sous Application Extension, en choisissant le type géré et hébergé par Apple. Ajoutez la capacité App Groups à l’app comme à l’extension, et placez les deux dans le même groupe. Ajoutez ensuite trois clés de liste de propriétés à la cible de l’app : BAAppGroupID, BAHasManagedAssetPacks réglée sur YES et BAUsesAppleHosting réglée sur YES. Apple vous demande d’omettre toutes les autres clés Background Assets pour les projets hébergés par Apple.11 Une contrainte fait facilement trébucher : adopter AssetPackManager sans adopter aussi le protocole d’extension correspondant relève, selon les mots d’Apple, d’« a programmer error ».15
La lecture des fichiers en retour passe par un espace de noms fusionné. Apple « automatically merges all of your asset packs into a shared namespace, effectively reconstructing your asset root folder as if it were pasted on a person’s device » : votre code adresse donc les fichiers par chemin sans suivre quel pack les contient.11 Les lectures renvoient par défaut des Data mappées en mémoire, avec une variante à descripteur de fichier pour le chargement procédural qu’il vous revient de fermer.11
Les tests en local imposent un coût de mise en place qu’il vaut mieux budgéter à part. Background Assets utilise HTTPS pour chaque téléchargement : le serveur simulé a donc besoin d’un certificat. La marche à suivre documentée par Apple passe par Trousseaux d’accès pour créer une autorité de certification racine auto-signée, Apple Configurator pour construire un profil portant cette CA, l’installation et l’approbation du profil sur chaque appareil de test, l’émission d’un certificat feuille SSL dont le nom correspond exactement à l’adresse IP ou au nom d’hôte du serveur, le démarrage du serveur, puis le réglage d’une substitution d’URL dans les réglages Développeur de chaque appareil.17
xcrun ba-serve --host localhost Tutorial.aar HighQualityTextures.aar
Budgétez cette séquence comme une tâche à part entière. On Demand Resources ne réclamait à aucun moment de serveur de votre part : Apple le décrit comme un gestionnaire de « content hosted on the App Store », et les ressources absentes de l’appareil « are requested from the App Store ».4 Migrer, c’est monter un hébergement, ou un substitut local dûment approuvé, avant de pouvoir déclencher le moindre téléchargement. En lisant les deux flux de travail côte à côte, je m’attends à ce que ce soit la chaîne de certificats, et non l’adoption de l’API, qui absorbe le premier jour d’une migration.
Les chiffres à intégrer au plan
Apple publie deux plafonds fermes pour les packs hébergés par Apple : 200 Go au total et 200 packs d’assets par fiche d’app. Les deux sont « shared across all platforms offered for your app ».12 Apple calcule le total à partir de la taille maximale parmi les versions éligibles à la distribution TestFlight ou App Store, en excluant les versions Awaiting Upload, Processing, Failed et entièrement Superseded, et vous envoie un e-mail à 80 % de la limite. Archiver un pack récupère de l’espace en supprimant toutes ses versions, y compris celles en ligne sur l’App Store.12
La voie non gérée remplace ces plafonds par quatre clés de liste de propriétés de premier niveau que vous réglez vous-même, dont l’une est un dictionnaire qui en contient trois autres, et la distinction compressé/décompressé est un vrai piège. BADownloadAllowance et BAEssentialDownloadAllowance bornent les tailles de téléchargement et prennent des valeurs compressées. BAMaxInstallSize et BAEssentialMaxInstallSize bornent les tailles installées et prennent des valeurs décompressées.9 Apple assortit les clés de taille d’installation d’un avertissement qui est en réalité un avertissement produit : « The App Store uses this key to show the size of your app on the product page, so provide an accurate value … Don’t overstate the disk space you require. »18 BADownloadDomainAllowList complète le jeu, en acceptant des domaines au format DNS avec un astérisque initial facultatif pour les caractères génériques.9
Un chiffre de plus mérite sa place dans le plan, et il vient des métadonnées de disponibilité plutôt que du texte. AssetPackManager est arrivée avec iOS 26.0, et quatre de ses membres portent déjà des dépréciations : ensureLocalAvailability(of:) et status(ofAssetPackWithID:) en 26.4, puis assetPack(withID:) et allAssetPacks en 27.0.19 La recherche, le statut et l’appel de téléchargement ont chacun déjà bougé une fois, sur deux versions intermédiaires. La route vers laquelle Apple oriente désormais, via la propriété manifest du gestionnaire, porte une annotation beta dans le SDK 27.0, tout comme la version groupée ensureLocalAvailability(of:requireLatestVersions:).19 Le guide Apple-hosted d’Apple lui-même montre encore deux des appels dépréciés.11 Le plancher pratique se situe donc au-dessus du 26.0 nominal du niveau géré. Écrire le chemin de téléchargement montré plus haut sans récolter d’avertissement de dépréciation suppose de viser 27.0, et d’accepter pour cela des symboles annotés beta. Le remplacement qu’on vous demande d’adopter est plus jeune et bouge plus vite que l’API qu’il remplace.
Qui la dépréciation touche réellement
La population concernée est étroite, et je n’en ai trouvé aucune trace dans mon propre code. J’ai fouillé sept projets en production à la recherche de NSBundleResourceRequest, beginAccessingResources, setPreservationPriority, de tout réglage de build ON_DEMAND_RESOURCES, de knownAssetTags et de configuration de tags dans le catalogue d’assets. Zéro occurrence, dans les sept, sur chacun des motifs. Un balayage de l’ensemble des fichiers Swift, Objective-C, listes de propriétés et pbxproj de mon répertoire de projets n’a rien renvoyé pour le moindre symbole ODR, ni pour Background Assets d’ailleurs.20
Ce résultat nul a une cause qui mérite d’être nommée, parce qu’elle se généralise. ODR existe pour les apps dont le contenu écrase le code. Mon plus gros catalogue d’assets appartient à Return, avec 66,6 Mo, et toutes les autres apps restent sous 8 Mo, Water et Yawara sous 100 Ko.20 À ces tailles, découper le contenu en packs ajoute des modes de défaillance réseau, une politique de stockage et une deuxième chaîne d’examen, pour économiser un téléchargement dont personne ne se plaint. Les apps qui ont vraiment besoin de Background Assets, ce sont les jeux avec contenu de niveaux, les apps qui livrent de gros modèles de machine learning, et tout ce qui embarque de la vidéo par langue, c’est-à-dire exactement la population visée par la prise en charge des packs d’assets localisés dans iOS 27.21
Les cibles de déploiement affinent le tableau, et c’est le chiffre à vérifier en premier dans n’importe quelle base de code. Cinq de mes six apps iOS sont déjà à iOS 26.0 ou plus, si bien que le niveau géré leur serait accessible dès aujourd’hui. Ace Citizenship déclare encore 17.0 et 17.5 sur certaines de ses cibles, ce qui exclurait le niveau géré et ne laisserait que la voie non gérée ou ODR déprécié.20 Faites cette vérification avant de concevoir quoi que ce soit : c’est la cible de déploiement minimale, et non le volume d’assets, qui décide de la migration qu’on vous propose réellement.
FAQ
On Demand Resources cesse-t-il de fonctionner dans iOS 27 ?
Non. Apple a marqué ODR et NSBundleResourceRequest comme dépréciés sans publier de version de suppression, de verrou à la soumission ni d’échec à l’exécution.1 Les API dépréciées continuent de fonctionner, et les tags existants continuent de se résoudre. Ce que vous obtenez, c’est un avertissement du compilateur. Le contraste avec les autres changements cassants du même cycle est instructif : l’obligation du cycle de vie des scènes fait que les apps « fail to launch », et l’exigence d’écran de lancement fait rejeter le build par l’App Store. La dépréciation d’ODR déclenche une horloge, elle ne ferme pas une porte.
Quelles plateformes la dépréciation couvre-t-elle ?
Les notes de version nomment quatre plateformes réparties sur trois documents : iOS et iPadOS 27, tvOS 27 et visionOS 27, toutes citant le radar 170066290.123 Les métadonnées de disponibilité de l’API vont plus loin : elles marquent NSBundleResourceRequest et les méthodes de priorité de préservation de Bundle comme dépréciées en 27.0 sur six plateformes, en ajoutant Mac Catalyst et watchOS.410 Mac Catalyst relève du cas d’école, puisque Apple documente que la classe ignore les appels venant des apps Catalyst.4 watchOS, non : Background Assets ne publie aucune disponibilité watchOS, et les packs hébergés par Apple sont disponibles « on all platforms except watchOS » — une app watchOS se retrouve donc avec une API dépréciée et aucun successeur documenté.56
Puis-je migrer si mon app prend en charge iOS 18 ?
Pas vers le niveau géré. AssetPackManager, ManagedDownloaderExtension, BAHasManagedAssetPacks et BAUsesAppleHosting exigent tous iOS 26.0.781415 Deux options subsistent sous ce plancher. La voie non gérée fonctionne à partir d’iOS 16.1, et elle vous demande d’héberger les assets, de définir votre propre format de manifeste, de l’analyser dans une extension, puis de déclarer des allocations de téléchargement et une liste d’autorisation de domaines dans votre liste de propriétés.9 Sinon, continuez d’utiliser ODR déprécié jusqu’à ce que votre cible de déploiement atteigne 26.0, ce que l’absence de date de suppression chez Apple autorise pour l’instant.
Qu’est-ce qui casse silencieusement si je porte le code ODR tel quel ?
Le stockage. ODR laissait le système purger le contenu tagué inutilisé, et setPreservationPriority(_:forTags:) ne faisait qu’indiquer un ordre.410 Background Assets ne supprime jamais un pack dont vous avez fini de vous servir tant que votre app reste installée : l’espace est à vous jusqu’à ce que vous appeliez remove(assetPackWithID:).11 Un code qui reproduit l’ancien motif beginAccessingResources / endAccessingResources sans ajouter de suppression explicite provoque une fuite d’espace disque sans fin, sans plantage ni avertissement pour le rattraper en test. Écrivez la politique d’éviction avant d’écrire le code de téléchargement.
À retenir
Pour les développeurs iOS :
- Vérifiez la cible de déploiement minimale avant toute chose. En dessous d’iOS 26.0, le niveau géré n’existe pas pour vous, et « use Background Assets instead » veut dire construire un hébergement, un format de manifeste et un analyseur sur la voie non gérée.79
- Écrivez une politique d’éviction dans le cadre de la migration. remove(assetPackWithID:) n’a aucun pendant automatique, et l’habitude ODR de relâcher une réclamation en faisant confiance au système laisse le stockage gonfler en silence.11
Pour les équipes qui livrent du contenu volumineux : - Budgétez la mise en place des tests en local séparément du code. La marche à suivre documentée par Apple passe par une autorité de certification racine auto-signée, un profil Apple Configurator installé et approuvé sur chaque appareil, un certificat feuille SSL correspondant au nom d’hôte du serveur et une substitution d’URL par appareil.17 - Planifiez avec 200 Go et 200 packs par fiche d’app, partagés entre toutes les plateformes où votre app est livrée, et guettez l’e-mail qu’Apple envoie à 80 %.12 Archiver pour récupérer de l’espace supprime des versions qui sont en ligne sur l’App Store.12
Pour les responsables de livraison : - Les packs hébergés par Apple impliquent une deuxième chaîne de soumission : chargés via Transporter ou l’API App Store Connect, versionnés indépendamment des builds, et soumis séparément à l’App Review.1113 Dimensionnez le cycle d’examen en conséquence. - Rien ne force la migration ce cycle-ci. Placez ODR derrière l’obligation du cycle de vie des scènes et l’exigence d’écran de lancement, assorties toutes deux d’une contrainte réelle, et revenez-y quand Apple publiera une version de suppression.
Le cycle 27 continue de trier ses changements cassants selon leur mordant : le cycle de vie des scènes empêche les apps de se lancer, l’écran de lancement empêche les builds de partir, et ODR se contente de déclencher une horloge. Savoir distinguer les uns des autres, c’est ce qui fait qu’on emploie bien son cycle. Pour le même schéma sur une surface plus réduite, voyez le retrait d’ImageCreator d’Image Playground. Le sommaire complet de la série se trouve sur la page Série Écosystème Apple.
Références
-
Apple, iOS & iPadOS 27 Release Notes, section On Demand Resources, Deprecations (radar 170066290) : « On Demand Resources and the
NSBundleResourceRequestAPI are deprecated. Use Background Assets instead. » Vérifié dans le JSON de documentation d’Apple le 25 juillet 2026. L’entrée constitue le texte complet ; les notes de version ne contiennent aucune version de suppression, aucune exigence de soumission et aucune formulation d’échec à l’exécution pour On Demand Resources. ↩↩↩↩↩↩ -
Apple, tvOS 27 Release Notes, section On Demand Resources, Deprecations (radar 170066290). Formulation identique à la note iOS et iPadOS. ↩↩↩↩
-
Apple, visionOS 27 Release Notes, section On Demand Resources, Deprecations (radar 170066290). Formulation identique. Les notes de version macOS 27 et watchOS 27 ne contiennent aucune entrée correspondante, vérification faite dans leur JSON de documentation le 25 juillet 2026. ↩↩↩↩
-
Apple, NSBundleResourceRequest, Foundation. Disponibilité : iOS 9.0, iPadOS 9.0, Mac Catalyst 13.1, tvOS 9.0, visionOS 1.0 et watchOS 2.0, chacune dépréciée en 27.0. Source du modèle de tags (« You identify on-demand resources during development by creating string identifiers known as tags »), du comportement de purge (« The system will not attempt to purge the resources marked with a tag from on-device storage as long as at least one
NSBundleResourceRequestobject is managing the tag »), de la note Mac Catalyst (« This class ignores calls from Mac apps built with Mac Catalyst ») et de la contrainte d’usage unique. Les API membresinit(tags:),beginAccessingResources(completionHandler:)etendAccessingResources()portent la même dépréciation 27.0 sur six plateformes. ↩↩↩↩↩↩↩↩↩↩ -
Apple, Background Assets, présentation du framework. Disponibilité : iOS 16.0, iPadOS 16.0, Mac Catalyst 16.0, macOS 13.0, tvOS 18.4 et visionOS 2.4, sans ligne watchOS. Source de « The default implementation of Managed Background Assets handles downloads, updates, compression, and more for you » et de « If you choose Apple-Hosted Background Assets, you upload your assets to App Store Connect and maintain them there, similar to app builds ». ↩↩↩↩↩↩
-
Apple, Creating managed asset packs, Background Assets. Source de « Apple-Hosted Background Assets can host up to 200GB of compressed assets and is available for apps distributed through the App Store on all platforms except watchOS ». ↩↩↩↩
-
Apple, BAHasManagedAssetPacks, référence Information Property List. Booléen, iOS 26.0, iPadOS 26.0, macOS 26.0, tvOS 26.0 et visionOS 26.0. Source de l’orientation vers le protocole d’extension : « use the StoreKit
StoreDownloaderExtensionprotocol if you set theBAUsesAppleHostingkey toYES; otherwise, use the Background AssetsManagedDownloaderExtensionprotocol. » Cette orientation documente la combinaison gérée auto-hébergée que les articles de tutoriel ne couvrent pas de bout en bout. ↩↩↩↩↩↩↩↩↩↩ -
Apple, BAUsesAppleHosting et BAAppGroupID, référence Information Property List. Les deux indiquent iOS 26.0, iPadOS 26.0, macOS 26.0, tvOS 26.0 et visionOS 26.0. À noter que
BAAppGroupID,BAHasManagedAssetPacksetBAUsesAppleHostingportent chacune une ligne Mac Catalyst 16.0 anormale à côté de leurs lignes 26.0 pour toutes les autres plateformes ; le plancher iOS 26.0 du niveau géré repose surAssetPackManager,ManagedDownloaderExtensionetBAHasManagedAssetPacksplutôt que surBAAppGroupID, que la voie non gérée exige également. ↩↩↩↩ -
Apple, Configuring an unmanaged Background Assets project, Background Assets. Source du type d’extension Self-Hosted, Unmanaged, de l’exigence App Groups sur les deux cibles, de la séquence de téléchargement à l’installation et à la mise à jour, et de l’énoncé de responsabilité : « It’s your responsibility to create manifest files for your self-hosted, unmanaged assets (using your format of choice) that your code parses to get the URLs and file sizes to the system. » Également source pour
BAManifestURL,BAInitialDownloadRestrictions,BADownloadAllowanceetBAEssentialDownloadAllowance(tailles compressées),BAMaxInstallSizeetBAEssentialMaxInstallSize(tailles décompressées), etBADownloadDomainAllowList(domaines au format DNS, astérisque initial facultatif pour les caractères génériques).BADownloaderExtensionest disponible à partir d’iOS 16.1, iPadOS 16.1, Mac Catalyst 16.1, macOS 13.0, tvOS 18.4 et visionOS 2.4 ;BAManifestURLà partir d’iOS 16.1. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Apple, setPreservationPriority(_:forTags:) et preservationPriority(forTag:), Foundation. Toutes deux introduites avec iOS 9.0 et dépréciées en 27.0 sur iOS, iPadOS, Mac Catalyst, tvOS, visionOS et watchOS. Source de « A hint to the system of the relative order for purging tagged sets of resources in the bundle ». ↩↩↩↩↩
-
Apple, Downloading Apple-hosted asset packs, Background Assets, avec Creating managed asset packs. Source du modèle d’extension Background Download et de son type Apple-Hosted, Managed, de l’exigence de groupe d’app partagé, de la configuration à trois clés de liste de propriétés assortie de la consigne « omit all other Background Assets information property list keys », des commandes
xcrun ba-package templateetxcrun ba-package, des clés de manifeste (assetPackID,downloadPolicy,installationEventTypesavecfirstInstallationetsubsequentUpdate,fileSelectorsavecfileetdirectory, etplatforms), des trois politiques de téléchargement (essential,prefetchetonDemand) et de leur comportement à l’installation, de la règle des chemins relatifs au répertoire d’empaquetage, de l’espace de noms fusionné (« The system automatically merges all of your asset packs into a shared namespace, effectively reconstructing your asset root folder as if it were pasted on a person’s device »), des lectures deDatamappées en mémoire et de la variante à descripteur de fichier, des canaux de téléversement (Transporter,altool, iTMSTransporter et l’API App Store Connect), et de la consigne de stockage : « the system won’t automatically remove your asset packs while your app is installed. Therefore, when you are done with an asset pack, call theremove(assetPackWithID:)method. » Les exemples de téléchargement de l’article appellent à la foisassetPack(withID:), que les données de disponibilité d’Apple marquent dépréciée en 27.0, etensureLocalAvailability(of:), dépréciée en 26.4 (voir la note 19). ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Apple, Apple-hosted asset pack size limits, aide App Store Connect. Total des packs d’assets : 200 Go ; nombre de packs : 200. Source de « The total sum of size usage for all asset packs uploaded to an app record in App Store Connect », de la méthode de calcul (taille maximale sur les versions éligibles à la distribution TestFlight ou App Store, en excluant Awaiting Upload, Processing, Failed et entièrement Superseded), de la notification par e-mail à 80 %, de « These limits are shared across all platforms offered for your app » et du comportement d’archivage, qui « removes all versions of an asset pack from App Store Connect, including those being tested in TestFlight and live on the App Store ». ↩↩↩↩↩
-
Apple, Overview of Apple-hosted asset packs, aide App Store Connect. Source du flux de travail en quatre étapes (empaqueter, charger, tester via TestFlight, soumettre à l’App Review), de l’indépendance des packs d’assets vis-à-vis des builds de l’app, et de la liste des plateformes prises en charge — iOS 26+, iPadOS 26+, macOS 26+, tvOS 26+ et visionOS 26+ — pour les assets gérés hébergés par Apple. ↩↩↩
-
Apple, ManagedDownloaderExtension, Background Assets. Protocole, iOS 26.0 et ultérieur sur les six plateformes listées. Fournit des implémentations par défaut pour chaque exigence héritée de
BADownloaderExtension, avec un avertissement invitant à ne pas implémenter les exigences héritées, à l’exception facultative debackgroundDownload(_:didReceive:). ↩↩↩↩↩ -
Apple, AssetPackManager, Background Assets. Acteur (
actor), iOS 26.0, iPadOS 26.0, Mac Catalyst 26.0, macOS 26.0, tvOS 26.0 et visionOS 26.0. Source de la note sur l’adhésion (« The first time that your code refers to the shared manager, Background Assets considers that your app is opting into automatic system management of your asset packs ») et de l’exigence d’appariement : adopter le gestionnaire sans le protocole d’extension géré correspondant constitue « a programmer error ». Également source pourcheckForUpdates(), qui « Gets the latest asset-pack information from the server, updates outdated asset packs, and removes obsolete asset packs », ainsi que pourremove(assetPackWithID:),url(for:)(non isolée, prenant unFilePathet renvoyant uneURL) etstatusUpdates(forAssetPackWithID:), dont aucune ne porte de dépréciation.AssetPacketManagedBackgroundAssetsErrorportent la même disponibilité iOS 26.0. Pour les membres du gestionnaire qui sont dépréciés, voir la note 19. ↩↩↩↩↩ -
Apple, StoreDownloaderExtension, StoreKit. Protocole affinant
ManagedDownloaderExtension, disponible sur iOS 26.0, iPadOS 26.0, macOS 26.0, tvOS 26.0 et visionOS 26.0. ↩ -
Apple, Testing asset packs locally, Background Assets. Source de l’exigence HTTPS, de la séquence de création de CA racine dans Trousseaux d’accès, de la création du profil Apple Configurator et des étapes d’installation et d’approbation sur chaque appareil, du certificat feuille SSL dont le nom doit être « a valid IP address, hostname, or domain name » correspondant au serveur, de la commande
xcrun ba-serveet de la substitution d’URL dans les réglages Développeur (Réglages > Développeur > Development Overrides sur iOS, iPadOS, tvOS et visionOS ;xcrun ba-serve url-overridesur macOS). ↩↩ -
Apple, BAEssentialMaxInstallSize et BAMaxInstallSize, référence Information Property List.
BAEssentialMaxInstallSizeà partir d’iOS 18.0,BAMaxInstallSizeà partir d’iOS 16.0. Toutes deux portent : « The App Store uses this key to show the size of your app on the product page, so provide an accurate value. If you compress the assets, use the uncompressed size of the files for this value. Don’t overstate the disk space you require. » Toutes deux sont indiquées comme requises pour utiliser Background Assets. ↩ -
Métadonnées de disponibilité d’Apple pour les membres d’
AssetPackManager, lues dans le JSON de documentation d’Apple le 25 juillet 2026. Membres dépréciés, tous introduits avec iOS 26.0 : ensureLocalAvailability(of:) déprécié en 26.4 ; status(ofAssetPackWithID:) déprécié en 26.4 au profit destatus(relativeTo:); assetPack(withID:) déprécié en 27.0 avec la note « CallassetPack(withID:)on the manager’smanifestproperty’s value » ; et allAssetPacks déprécié en 27.0 au profit de la propriétéassetPacksdu manifeste. Symboles de remplacement introduits avec iOS 27.0 et signalés beta dans le SDK actuel : manifest,AssetPackManifest.assetPack(withID:)(synchrone, renvoyant unAssetPackoptionnel) et ensureLocalAvailability(of:requireLatestVersions:). ensureLocalAvailability(of:requireLatestVersion:) est arrivé en 26.4 et n’est pas déprécié. L’observation selon laquelle le guide Apple-hosted d’Apple montre encore deux appels dépréciés,assetPack(withID:)etensureLocalAvailability(of:), est celle de l’auteur, à partir d’une comparaison entre le texte de l’article et la disponibilité des symboles à la même date. ↩↩ -
Relevé de l’auteur sur sept projets en production le 25 juillet 2026 : Reps, Return, Banana List, Ace Citizenship, Water, ResumeGeni et Yawara. Recherche dans tous les fichiers Swift, Objective-C, en-têtes, listes de propriétés et
project.pbxproj, en excluantbuild,DerivedData,.build,Podset.git, deNSBundleResourceRequest,beginAccessingResources,setPreservationPriority,On Demand Resources, de tout réglage de buildON_DEMAND_RESOURCES, deknownAssetTagset des réglagesASSETCATALOG_COMPILER_*TAG. Zéro correspondance sur chaque motif dans chaque projet, et zéro correspondance pour les symboles Background Assets. Totaux des catalogues d’assets mesurés avecdusur tous les répertoires.xcassets, en excluant la sortie de build, les captures d’écran fastlane et les répertoires de rapports : Return 66,62 Mo, Ace Citizenship 7,81 Mo, Banana List 2,04 Mo, Reps 1,66 Mo, Water 0,04 Mo et Yawara 0,01 Mo. ValeursIPHONEOS_DEPLOYMENT_TARGETlues dans chaqueproject.pbxproj: Reps 26.0 et 26.2, Return 26.1, Banana List 26.0, Water 26.0, Yawara 26.5, et Ace Citizenship 17.0, 17.5 et 26.1 selon les cibles. ↩↩↩ -
Apple, Reducing download and storage demands with localized asset packs, Background Assets. Source de la désignation
languageajoutée aux packs d’assets dans macOS 27, iOS 27, tvOS 27 et visionOS 27, des règles d’identifiants BCP-47 (sous-étiquettes de langue, de région et d’écriture uniquement, sans variantes ni extensions) et de la clélanguagedu modèle Xcode 27. ↩