← Alle Beitrage

On Demand Resources ist veraltet: Was Background Assets kostet

Apple hat ein zehn Jahre altes System zur Auslieferung von Inhalten in 13 Wörtern beerdigt: „On Demand Resources und die NSBundleResourceRequest-API sind veraltet. Verwenden Sie stattdessen Background Assets.”1

Dieser Satz ist der vollständige Eintrag. Er trägt die Radar-Nummer 170066290, steht unter „Deprecations” und wiederholt sich wortgleich in drei verschiedenen Release Notes.123 Eine Version für die Entfernung hat Apple nicht genannt, ebenso wenig einen Migrationsleitfaden, der an diese Abkündigung anknüpft, oder einen entsprechenden Hinweis in den Release Notes zu macOS oder watchOS.

Die eigentliche Arbeit steckt im letzten Satz. Background Assets ist keine einzelne Sache, sondern zerfällt in drei Konfigurationen mit unterschiedlichen Hosting-Modellen, unterschiedlichen minimalen Deployment-Targets und Migrationskosten, die rund eine Größenordnung auseinanderliegen. Die Entscheidung fällt, bevor Sie die erste Zeile Code schreiben — und sie falsch zu treffen, ist der teure Fehler.

TL;DR

  • Apple hat On Demand Resources und NSBundleResourceRequest in den Release Notes zu iOS und iPadOS 27, tvOS 27 sowie visionOS 27 für veraltet erklärt.123 ODR funktioniert weiterhin. Ein Datum für die Entfernung hat Apple nicht genannt, und die abgekündigten APIs werden weiterhin ausgeliefert und lösen weiterhin Tags auf.
  • Die Verfügbarkeitsdaten der API selbst weisen sie auf sechs Plattformen als veraltet aus — zwei mehr, als irgendeine Release Note erwähnt: Mac Catalyst und watchOS.4 Für Background Assets ist überhaupt keine watchOS-Verfügbarkeit dokumentiert; watchOS erhält also eine Abkündigung ohne dokumentierten Nachfolger.56
  • „Verwenden Sie stattdessen Background Assets” teilt sich in drei Wege: verwaltet mit Hosting durch Apple, verwaltet mit eigenem Hosting und unverwaltet. Beide verwalteten Wege setzen iOS 26.0 als minimales Deployment-Target voraus.78 Unterhalb von 26.0 bleibt nur der unverwaltete Weg — und der verlangt, dass Sie die Dateien selbst hosten, das Manifestformat selbst erfinden und es selbst parsen.9
  • Die Speicherverwaltung kehrt sich um. Bei ODR durfte das System ungenutzte, mit Tags versehene Ressourcen entfernen und nahm setPreservationPriority(_:forTags:) als Hinweis auf die Reihenfolge.410 Background Assets behält jedes heruntergeladene Pack auf dem Gerät, bis Ihr Code remove(assetPackWithID:) aufruft.11
  • Apple hostet bis zu 200 GB komprimierte Asset Packs und höchstens 200 Packs pro App-Datensatz — geteilt über alle Plattformen hinweg, die Ihre App anbietet, in App Store Connect hochgeladen und getrennt von den Builds geprüft.1213

Was Apple genau abgekündigt hat

Drei Details tragen das Gewicht dieses Eintrags — und keines davon steht darin.

Der Geltungsbereich reicht weiter als die Release Notes. Drei Dokumente enthalten den Eintrag: iOS und iPadOS 27, tvOS 27 sowie visionOS 27, jeweils unter der Überschrift „On Demand Resources” mit der Unterüberschrift „Deprecations” und jeweils mit derselben Radar-Nummer.123 In den Notes zu macOS 27 und watchOS 27 steht dazu nichts.

Die Verfügbarkeitsangabe der API erzählt mehr. NSBundleResourceRequest ist als eingeführt in iOS 9.0 und veraltet ab 27.0 vermerkt, mit derselben Abkündigung in 27.0 für iPadOS 9.0, Mac Catalyst 13.1, tvOS 9.0, visionOS 1.0 und watchOS 2.0.4 Sechs Plattformen in den Metadaten, vier in den Release Notes. Die beiden Methoden von Bundle zur Aufbewahrungspriorität tragen dieselbe Annotation für sechs Plattformen.10 Eine Bestandsaufnahme, die sich allein auf die Release Notes stützt, übersieht die Einträge zu Mac Catalyst und watchOS vollständig.

Der Eintrag zu Mac Catalyst ist reine Formsache. Apple dokumentiert, dass NSBundleResourceRequest „Aufrufe von Mac-Apps ignoriert, die mit Mac Catalyst erstellt wurden” — die Abkündigung verabschiedet dort also eine API, die ohnehin nie etwas getan hat.4 Der watchOS-Eintrag ist keine Formsache. Background Assets nennt Verfügbarkeit für iOS 16.0, iPadOS 16.0, Mac Catalyst 16.0, macOS 13.0, tvOS 18.4 und visionOS 2.4 — eine Zeile für watchOS fehlt.5 Apple sagt unmissverständlich, dass von Apple gehostete Asset Packs „für Apps verfügbar sind, die über den App Store auf allen Plattformen außer watchOS vertrieben werden”.6 Eine watchOS-App, die ODR nutzt, bekommt eine Veraltungswarnung und keinen Nachfolger, zu dem sie migrieren könnte.

Der Druck ist der geringste unter den drei Änderungen des 27er-Zyklus, die ich behandelt habe. Veraltet heißt veraltet. Apple hat weder eine Version für die Entfernung veröffentlicht noch eine Hürde bei der Einreichung noch einen Laufzeitfehler. Vergleichen Sie das mit der Pflicht zum Scene-Lebenszyklus aus demselben Zyklus, bei der Apps, die mit dem neuen SDK erstellt wurden, „nicht starten”, oder mit der Pflicht zum Launch Screen, bei der der App Store den Build rundheraus ablehnt. ODR tut weder das eine noch das andere. Bestehende Tags werden weiterhin aufgelöst, bestehende Aufrufe liefern weiterhin Ressourcen, und ausgelieferte Binaries laufen weiter. Was kommt, ist eine Compiler-Warnung und eine Uhr, die niemand ablesen kann.

Der Zeitpunkt wirkt wie eine Entscheidung, nicht wie Aufräumarbeit. Apple hat die API für vier Plattformnamen auf einmal abgekündigt, ein Release, nachdem die verwaltete Stufe des Nachfolgers erschienen war. Betrachten Sie die Abkündigung als Beginn eines Migrationsfensters, dessen Länge Apple nicht veröffentlicht hat — nicht als Notfall.

Die Weggabelung vor der ersten Codezeile

Apples Framework-Übersicht beschreibt zwei Hosting-Modelle und eine verwaltete Voreinstellung, die „Downloads, Updates, Komprimierung und mehr für Sie übernimmt”. Beim Hosting durch Apple „laden Sie Ihre Assets zu App Store Connect hoch und pflegen sie dort, ähnlich wie App-Builds”.5 Die Vorlage für die Background-Download-Erweiterung in Xcode nennt zwei Typen direkt: von Apple gehostet und verwaltet sowie selbst gehostet und unverwaltet.911 Eine dritte Kombination steckt in den Property-List-Schlüsseln: BAHasManagedAssetPacks auf YES ohne BAUsesAppleHosting wählt verwaltete Asset Packs, die Sie selbst hosten; die zugehörige Dokumentation verweist dafür auf das Protokoll ManagedDownloaderExtension statt auf StoreDownloaderExtension aus StoreKit.7814

Von Apple gehostet, verwaltet Verwaltet, selbst gehostet Selbst gehostet, unverwaltet
Mindestversion iOS 26.0715 26.0714 16.19
Wer die Dateien hostet Apple, über App Store Connect6 Sie Sie
Manifestformat Apples JSON-Schema11 Apples JSON-Schema11 Von Ihnen zu erfinden und zu parsen9
Protokoll der Erweiterung StoreDownloaderExtension716 ManagedDownloaderExtension714 BADownloaderExtension9
Downloads, Updates, Komprimierung System5 System5 Sie9
Property-List-Schlüssel 311 Nicht durchgängig dokumentiert7 4 auf oberster Ebene, einer davon mit 3 weiteren9

Für die meisten Teams entscheidet das Deployment-Target. Jeder Einstiegspunkt in die verwaltete Stufe verlangt mindestens iOS 26.0 — von AssetPackManager und ManagedDownloaderExtension bis hinunter zu den drei Property-List-Schlüsseln.781415 Eine App, die iOS 18 unterstützt, kann die verwaltete Stufe gar nicht übernehmen; es bleiben ihr der unverwaltete Weg, der bis iOS 16.1 zurückreicht, oder das abgekündigte ODR, bis das Deployment-Target nachzieht.9

Der unverwaltete Weg ist eine andere Aufgabe. In Apples Ablauf lädt das System vor dem Start Ihrer App ein Manifest von BAManifestURL, übergibt die Datei an Ihre Erweiterung und nimmt eine Menge von Download-Anfragen entgegen.9 Apple benennt die Aufgabenteilung ohne Umschweife: „Es liegt in Ihrer Verantwortung, Manifestdateien für Ihre selbst gehosteten, unverwalteten Assets zu erstellen (in einem Format Ihrer Wahl), die Ihr Code parst, um dem System die URLs und Dateigrößen zu liefern.”9 Sie stellen Hosting, ein CDN, ein Manifestschema, einen Parser und eine Liste erlaubter Domains. Wer „Verwenden Sie stattdessen Background Assets” als bloßen Austausch einer API liest, liest die verwaltete Stufe und bekommt die Rechnung für die unverwaltete.

Was ODR geliefert hat und Sie nun von Hand nachbauen

Drei Verhaltensweisen von ODR haben kein direktes Gegenstück.

Aus Tags werden Asset Packs. ODR kennzeichnete Inhalte über Zeichenketten-Tags, die in Xcode vergeben wurden; NSBundleResourceRequest(tags:) beanspruchte einen oder mehrere davon.4 Background Assets ersetzt Tags durch Asset Packs: Verzeichnisse mit Dateien, beschrieben durch ein JSON-Manifest und von einem Kommandozeilenwerkzeug in ein .aar-Archiv komprimiert. Die Granularität wird gröber, und die Zuordnung wandert aus Xcodes Asset-Katalog in eine Datei, die Sie pflegen.

Aus dem Hosting durch Apple wird ein eigener Release-Strang. ODR-Inhalte fuhren mit dem Build mit. Von Apple gehostete Asset Packs laden Sie unabhängig davon über Transporter, altool, iTMSTransporter oder die App Store Connect API hoch und reichen sie getrennt von der App zum App Review ein.1113 Die Entkopplung ist der eigentliche Gewinn: Sie liefern neue Inhalte aus, ohne einen Build auszuliefern. Der Preis sind eine zweite Einreichungsstrecke, eine zweite Prüfschlange und ein zweiter Satz Statuswerte, den Sie im Blick behalten müssen.

Das automatische Aufräumen wird Ihre Aufgabe — und diese Umkehr ist die schärfste Änderung. ODR behandelte heruntergeladene Inhalte als Cache, der dem System gehörte. Apple dokumentierte, dass das System „nicht versucht, die mit einem Tag markierten Ressourcen aus dem Gerätespeicher zu entfernen, solange mindestens ein NSBundleResourceRequest-Objekt dieses Tag verwaltet” — eine Zusage darüber, wann aufgeräumt wird, nicht ob.4 setPreservationPriority(_:forTags:) existierte genau dafür, dem System „einen Hinweis auf die relative Reihenfolge zu geben, in der mit Tags versehene Ressourcengruppen im Bundle entfernt werden”.10 Sie gaben Ihren Anspruch auf, das System holte sich den Platz nach eigenem Zeitplan zurück, und der Umgang mit knappem Speicher war Apples Problem.

Background Assets dreht die Zuständigkeit um. Das System hält Packs automatisch aktuell, und checkForUpdates() entfernt Packs, die auf dem Server obsolet geworden sind.15 Keiner der beiden Mechanismen räumt ein Pack weg, mit dem Sie schlicht fertig sind. Apples Anweisung ist eindeutig: „Das System entfernt Ihre Asset Packs nicht automatisch, solange Ihre App installiert ist. Rufen Sie deshalb die Methode remove(assetPackWithID:) auf, wenn Sie ein Asset Pack nicht mehr benötigen.”11

Aus dem gültigkeitsbereichsgebundenen, referenzgezählten Muster wird ein explizites Löschen, dessen Aufruf Sie selbst entscheiden müssen:

// 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")

Jede App, die eine ODR-Annahme über automatisches Aufräumen mit sich trägt, braucht eine eigens dafür geschriebene Speicherrichtlinie. Der Fehlerfall verläuft leise: Nichts stürzt ab, nichts warnt, und der Gerätespeicher füllt sich, bis ein Nutzer Ihre App in der Speicherliste bemerkt.

Die Migrationsfläche, Punkt für Punkt

Für den verwalteten Weg mit Hosting durch Apple ergibt sich aus Apples eigenen Schritten diese Checkliste.

Fassen Sie Dateien zu Asset Packs zusammen und wählen Sie pro Pack eine Download-Richtlinie. Es gibt drei. essential lädt während der Installation und fließt in den Fortschritt ein, den Nutzer im App Store, in TestFlight und auf dem Home-Bildschirm sehen. prefetch beginnt während der Installation und läuft danach im Hintergrund weiter. onDemand lädt nur, wenn Ihr Code es verlangt.11 Für essential und prefetch nimmt ein verschachteltes Array installationEventTypes die Werte firstInstallation, subsequentUpdate oder beide entgegen, sodass ein Tutorial-Pack bei der Erstinstallation geladen und bei jedem späteren Update übersprungen wird.11

Schreiben Sie pro Pack ein Manifest. Xcode erzeugt eine kommentierte Vorlage:

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>"]
}

Dateipfade werden relativ zu dem Verzeichnis aufgelöst, in dem Sie den Packaging-Befehl ausführen — was später erneut wichtig wird, wenn Sie Dateien über ihren Pfad wieder auslesen.11 Archivieren Sie jedes Pack:

xcrun ba-package Manifest.json -o Tutorial.aar

Fügen Sie unter „Application Extension” ein Target für eine Background-Download-Erweiterung hinzu und wählen Sie als Typ die von Apple gehostete, verwaltete Variante. Aktivieren Sie die Capability „App Groups” sowohl für die App als auch für die Erweiterung und legen Sie beide in dieselbe Gruppe. Ergänzen Sie anschließend im App-Target drei Property-List-Schlüssel: BAAppGroupID, BAHasManagedAssetPacks mit YES und BAUsesAppleHosting mit YES. Apple weist ausdrücklich an, für Projekte mit Hosting durch Apple jeden weiteren Background-Assets-Schlüssel wegzulassen.11 Über eine Einschränkung stolpert man leicht: AssetPackManager zu verwenden, ohne auch das passende Erweiterungsprotokoll zu übernehmen, ist in Apples Worten „ein Programmierfehler”.15

Das Auslesen der Dateien läuft über einen zusammengeführten Namensraum. Apple „führt alle Ihre Asset Packs automatisch in einem gemeinsamen Namensraum zusammen und rekonstruiert damit Ihren Asset-Wurzelordner so, als wäre er auf das Gerät einer Person kopiert worden” — Code spricht Dateien also über ihren Pfad an, ohne zu verfolgen, in welchem Pack sie liegen.11 Lesezugriffe liefern standardmäßig speicherabgebildete Data; für prozedurales Laden gibt es eine Variante mit Dateideskriptor, den Sie selbst schließen müssen.11

Das lokale Testen bringt einen Einrichtungsaufwand mit, den Sie getrennt einplanen sollten. Background Assets nutzt für jeden Download HTTPS, der Mock-Server braucht also ein Zertifikat. Apples dokumentierter Weg führt über die Schlüsselbundverwaltung, um eine selbstsignierte Root-CA zu erzeugen, über Apple Configurator, um ein Profil mit dieser CA zu bauen, über Installation und Vertrauensstellung dieses Profils auf jedem Testgerät, über ein SSL-Leaf-Zertifikat, dessen Name exakt zur IP-Adresse oder zum Hostnamen des Servers passt, über den Start des Servers und schließlich über eine URL-Überschreibung in den Entwicklereinstellungen jedes Geräts.17

xcrun ba-serve --host localhost Tutorial.aar HighQualityTextures.aar

Planen Sie diese Abfolge als eigene Aufgabe ein. On Demand Resources brauchte zu keinem Zeitpunkt einen Server von Ihnen: Apple beschreibt es als Verwaltung für „im App Store gehostete Inhalte”, und Ressourcen, die auf dem Gerät fehlen, „werden beim App Store angefordert”.4 Migrieren heißt, Hosting aufzubauen — oder eine vertrauenswürdige Nachbildung davon —, bevor Sie überhaupt einen einzigen Download ausprobieren können. Wenn ich die beiden Arbeitsabläufe nebeneinanderlege, erwarte ich, dass der erste Tag einer Migration von der Zertifikatskette verschlungen wird und nicht von der Übernahme der API.

Die Zahlen, mit denen Sie planen

Apple veröffentlicht zwei harte Obergrenzen für von Apple gehostete Packs: 200 GB insgesamt und 200 Asset Packs pro App-Datensatz. Beide werden „über alle für Ihre App angebotenen Plattformen hinweg geteilt”.12 Apple berechnet die Summe aus der maximalen Größe über alle Versionen, die für TestFlight oder die Verbreitung im App Store infrage kommen, ohne Versionen mit den Status „Awaiting Upload”, „Processing”, „Failed” und vollständig „Superseded”, und schickt Ihnen bei 80 % der Grenze eine E-Mail. Ein Pack zu archivieren gibt Platz frei, indem alle seine Versionen entfernt werden — auch die, die im App Store live sind.12

Auf dem unverwalteten Weg treten an die Stelle dieser Obergrenzen vier Property-List-Schlüssel auf oberster Ebene, die Sie selbst setzen — einer davon ein Dictionary mit drei weiteren —, und die Trennung zwischen komprimiert und unkomprimiert ist eine echte Falle. BADownloadAllowance und BAEssentialDownloadAllowance begrenzen Downloadgrößen und erwarten komprimierte Werte. BAMaxInstallSize und BAEssentialMaxInstallSize begrenzen installierte Größen und erwarten unkomprimierte Werte.9 An die Schlüssel für die Installationsgröße hängt Apple eine Warnung, die eigentlich eine Produktwarnung ist: „Der App Store zeigt anhand dieses Schlüssels die Größe Ihrer App auf der Produktseite an; geben Sie deshalb einen genauen Wert an … Überschätzen Sie den benötigten Speicherplatz nicht.”18 BADownloadDomainAllowList vervollständigt den Satz und nimmt Domains im DNS-Format entgegen, optional mit führendem Sternchen als Platzhalter.9

Eine weitere Zahl gehört in die Planung, und sie stammt aus Verfügbarkeitsmetadaten statt aus Fließtext. AssetPackManager erschien mit iOS 26.0, und vier seiner Mitglieder sind bereits als veraltet markiert: ensureLocalAvailability(of:) und status(ofAssetPackWithID:) ab 26.4, danach assetPack(withID:) und allAssetPacks ab 27.0.19 Suche, Status und der Download-Aufruf sind damit innerhalb von zwei Point-Releases jeweils einmal umgezogen. Der Weg, auf den Apple jetzt verweist — über die Eigenschaft manifest des Managers —, trägt im SDK 27.0 eine Beta-Kennzeichnung, ebenso das stapelverarbeitende ensureLocalAvailability(of:requireLatestVersions:).19 Apples eigene Anleitung zum Hosting durch Apple führt weiterhin zwei der abgekündigten Aufrufe vor.11 Die praktische Untergrenze liegt damit über den nominellen 26.0 dieser Stufe. Wer den oben gezeigten Download-Pfad ohne Veraltungswarnung schreiben will, zielt auf 27.0 und nimmt dafür beta-gekennzeichnete Symbole in Kauf. Der Nachfolger, den Sie übernehmen sollen, ist jünger und bewegt sich schneller als die API, die er ersetzt.

Wen die Abkündigung tatsächlich trifft

Der betroffene Kreis ist schmal — in meinem eigenen Code habe ich ihn nicht gefunden. Ich habe sieben ausgelieferte Projekte nach NSBundleResourceRequest, beginAccessingResources, setPreservationPriority, jeder ON_DEMAND_RESOURCES-Build-Einstellung, knownAssetTags und Tag-Konfigurationen im Asset-Katalog durchsucht. Null Treffer, in allen sieben, bei jedem Muster. Ein Durchlauf über sämtliche Swift-, Objective-C-, Property-List- und pbxproj-Dateien in meinem Projektverzeichnis lieferte nichts zu irgendeinem ODR-Symbol — und ebenso wenig zu Background Assets.20

Das Nullergebnis hat eine Ursache, die man benennen sollte, weil sie sich verallgemeinern lässt. ODR ist für Apps gedacht, deren Inhalte den Code in den Schatten stellen. Mein größter Asset-Katalog gehört zu Return mit 66,6 MB, jede andere App bleibt unter 8 MB, Water und Yawara sogar unter 100 KB.20 In dieser Größenordnung bringt das Aufteilen der Inhalte in Packs zusätzliche Netzwerkfehlerfälle, eine Speicherrichtlinie und eine zweite Prüfstrecke — und spart dafür einen Download ein, über den sich niemand beschwert. Die Apps, die Background Assets wirklich brauchen, sind Spiele mit Level-Inhalten, Apps mit großen Machine-Learning-Modellen und alles mit Video pro Sprache — also genau die Gruppe, auf die Apples Unterstützung für lokalisierte Asset Packs in iOS 27 zielt.21

Die Deployment-Targets schärfen das Bild — und sie sind die Zahl, die man in jeder Codebasis zuerst prüfen sollte. Fünf meiner sechs iOS-Apps liegen bereits bei iOS 26.0 oder höher, die verwaltete Stufe stünde ihnen also heute offen. Ace Citizenship deklariert auf einigen Targets weiterhin 17.0 und 17.5, was die verwaltete Stufe ausschließt und nur den unverwalteten Weg oder das abgekündigte ODR übrig lässt.20 Machen Sie diese Prüfung, bevor Sie irgendetwas entwerfen: Welche Migration Ihnen tatsächlich offensteht, entscheidet das minimale Deployment-Target, nicht die Menge der Assets.

FAQ

Hört On Demand Resources unter iOS 27 auf zu funktionieren?

Nein. Apple hat ODR und NSBundleResourceRequest als veraltet markiert, aber weder eine Version für die Entfernung noch eine Hürde bei der Einreichung noch einen Laufzeitfehler veröffentlicht.1 Als veraltet markierte APIs funktionieren weiter, und bestehende Tags werden weiterhin aufgelöst. Was Sie bekommen, ist eine Compiler-Warnung. Der Kontrast zu den anderen Breaking Changes desselben Zyklus ist aufschlussreich: Die Pflicht zum Scene-Lebenszyklus sorgt dafür, dass Apps „nicht starten”, und die Pflicht zum Launch Screen sorgt dafür, dass der App Store den Build ablehnt. Die ODR-Abkündigung startet eine Uhr, sie schließt keine Tür.

Welche Plattformen erfasst die Abkündigung?

Die Release Notes nennen in drei Dokumenten vier Plattformen: iOS und iPadOS 27, tvOS 27 sowie visionOS 27, jeweils mit Verweis auf Radar 170066290.123 Die Verfügbarkeitsmetadaten der API greifen weiter: Sie markieren NSBundleResourceRequest und die Methoden von Bundle zur Aufbewahrungspriorität auf sechs Plattformen ab 27.0 als veraltet und nehmen Mac Catalyst und watchOS hinzu.410 Bei Mac Catalyst ist das akademisch, denn Apple dokumentiert, dass die Klasse Aufrufe aus Catalyst-Apps ignoriert.4 Bei watchOS ist es das nicht: Für Background Assets ist keine watchOS-Verfügbarkeit dokumentiert, und von Apple gehostete Packs stehen „auf allen Plattformen außer watchOS” zur Verfügung — eine watchOS-App hat also eine abgekündigte API und keinen dokumentierten Nachfolger.56

Kann ich migrieren, wenn meine App iOS 18 unterstützt?

Nicht in die verwaltete Stufe. AssetPackManager, ManagedDownloaderExtension, BAHasManagedAssetPacks und BAUsesAppleHosting setzen allesamt iOS 26.0 voraus.781415 Unterhalb dieser Schwelle bleiben zwei Möglichkeiten. Der unverwaltete Weg funktioniert ab iOS 16.1 und verlangt, dass Sie die Assets hosten, ein eigenes Manifestformat definieren, es in einer Erweiterung parsen und Downloadkontingente sowie eine Liste erlaubter Domains in Ihrer Property List deklarieren.9 Andernfalls bleiben Sie beim abgekündigten ODR, bis Ihr Deployment-Target 26.0 erreicht — was Apple mangels eines Entfernungsdatums derzeit zulässt.

Was geht still kaputt, wenn ich ODR-Code eins zu eins übernehme?

Der Speicher. Bei ODR durfte das System ungenutzte, mit Tags versehene Inhalte entfernen, und setPreservationPriority(_:forTags:) gab lediglich einen Hinweis auf die Reihenfolge.410 Background Assets entfernt ein Pack, mit dem Sie fertig sind, nie, solange Ihre App installiert bleibt — der Platz gehört Ihnen, bis Sie remove(assetPackWithID:) aufrufen.11 Code, der das alte Muster aus beginAccessingResources und endAccessingResources nachbildet, ohne ein explizites Löschen zu ergänzen, lässt den Speicher unbegrenzt volllaufen, ohne Absturz und ohne Warnung, die das im Test auffangen würde. Schreiben Sie die Aufräumrichtlinie, bevor Sie den Download-Code schreiben.

Die wichtigsten Erkenntnisse

Für iOS-Entwickler: - Prüfen Sie vor allem anderen das minimale Deployment-Target. Unterhalb von iOS 26.0 existiert die verwaltete Stufe für Sie nicht, und „Verwenden Sie stattdessen Background Assets” bedeutet, auf dem unverwalteten Weg Hosting, ein Manifestformat und einen Parser zu bauen.79 - Schreiben Sie im Rahmen der Migration eine Aufräumrichtlinie. Zu remove(assetPackWithID:) gibt es kein automatisches Gegenstück, und die ODR-Gewohnheit, einen Anspruch aufzugeben und dem System zu vertrauen, lässt den Speicherbedarf still weiterwachsen.11

Für Teams, die große Inhalte ausliefern: - Planen Sie die Einrichtung der lokalen Tests getrennt vom Code ein. Apples dokumentierter Weg führt über eine selbstsignierte Root-CA, ein Apple-Configurator-Profil, das auf jedem Gerät installiert und als vertrauenswürdig eingestuft wird, ein SSL-Leaf-Zertifikat passend zum Hostnamen des Servers und eine URL-Überschreibung pro Gerät.17 - Planen Sie mit 200 GB und 200 Packs pro App-Datensatz, geteilt über alle Plattformen hinweg, auf denen Ihre App erscheint, und achten Sie auf die E-Mail, die Apple bei 80 % verschickt.12 Wer zum Freiräumen archiviert, entfernt damit auch Versionen, die im App Store live sind.12

Für Release-Verantwortliche: - Von Apple gehostete Packs bedeuten eine zweite Einreichungsstrecke: hochgeladen über Transporter oder die App Store Connect API, unabhängig von den Builds versioniert und eigenständig beim App Review eingereicht.1113 Besetzen Sie den Prüfzyklus entsprechend. - In diesem Zyklus erzwingt nichts die Migration. Reihen Sie ODR hinter der Pflicht zum Scene-Lebenszyklus und der Pflicht zum Launch Screen ein, die beide echte Durchsetzung mitbringen, und sehen Sie erneut hin, sobald Apple eine Version für die Entfernung veröffentlicht.


Der 27er-Zyklus sortiert seine Breaking Changes weiterhin nach Biss: Der Scene-Lebenszyklus hindert Apps am Start, der Launch Screen hindert Builds an der Auslieferung, und ODR startet lediglich eine Uhr. Zu wissen, was was ist, entscheidet darüber, ob Sie den Zyklus gut nutzen. Dasselbe Muster auf kleinerer Fläche finden Sie unter ImageCreator verschwindet aus Image Playground. Der Sammelpunkt der gesamten Reihe ist die Apple-Ecosystem-Reihe.

Quellen


  1. Apple, iOS & iPadOS 27 Release Notes, Abschnitt „On Demand Resources”, Deprecations (Radar 170066290): „On Demand Resources und die NSBundleResourceRequest-API sind veraltet. Verwenden Sie stattdessen Background Assets.” Geprüft anhand von Apples Dokumentations-JSON am 25. Juli 2026. Der Eintrag ist der vollständige Text; die Release Notes enthalten für On Demand Resources keine Version für die Entfernung, keine Anforderung an die Einreichung und keine Formulierung zu Laufzeitfehlern. 

  2. Apple, tvOS 27 Release Notes, Abschnitt „On Demand Resources”, Deprecations (Radar 170066290). Wortgleich mit dem Eintrag für iOS und iPadOS. 

  3. Apple, visionOS 27 Release Notes, Abschnitt „On Demand Resources”, Deprecations (Radar 170066290). Wortgleicher Eintrag. Die Release Notes zu macOS 27 und watchOS 27 enthalten keinen entsprechenden Eintrag; geprüft durch Suche in deren Dokumentations-JSON am 25. Juli 2026. 

  4. Apple, NSBundleResourceRequest, Foundation. Verfügbarkeit: iOS 9.0, iPadOS 9.0, Mac Catalyst 13.1, tvOS 9.0, visionOS 1.0 und watchOS 2.0, jeweils veraltet ab 27.0. Quelle für das Tag-Modell („Sie kennzeichnen On-Demand-Ressourcen während der Entwicklung, indem Sie Zeichenketten-Bezeichner erstellen, die als Tags bekannt sind”), für das Aufräumverhalten („Das System versucht nicht, die mit einem Tag markierten Ressourcen aus dem Gerätespeicher zu entfernen, solange mindestens ein NSBundleResourceRequest-Objekt dieses Tag verwaltet”), für den Hinweis zu Mac Catalyst („Diese Klasse ignoriert Aufrufe von Mac-Apps, die mit Mac Catalyst erstellt wurden”) und für die Einschränkung auf einmalige Verwendung. Die Mitglieds-APIs init(tags:), beginAccessingResources(completionHandler:) und endAccessingResources() tragen dieselbe Abkündigung ab 27.0 auf sechs Plattformen. 

  5. Apple, Background Assets, Framework-Übersicht. Verfügbarkeit: iOS 16.0, iPadOS 16.0, Mac Catalyst 16.0, macOS 13.0, tvOS 18.4 und visionOS 2.4, ohne Zeile für watchOS. Quelle für „Die Standardimplementierung von Managed Background Assets übernimmt Downloads, Updates, Komprimierung und mehr für Sie” und „Wenn Sie Apple-Hosted Background Assets wählen, laden Sie Ihre Assets zu App Store Connect hoch und pflegen sie dort, ähnlich wie App-Builds”. 

  6. Apple, Creating managed asset packs, Background Assets. Quelle für „Apple-Hosted Background Assets kann bis zu 200 GB komprimierte Assets hosten und steht für Apps zur Verfügung, die über den App Store auf allen Plattformen außer watchOS vertrieben werden”. 

  7. Apple, BAHasManagedAssetPacks, Referenz „Information Property List”. Boolean, iOS 26.0, iPadOS 26.0, macOS 26.0, tvOS 26.0 und visionOS 26.0. Quelle für die Zuordnung des Erweiterungsprotokolls: „Verwenden Sie das StoreKit-Protokoll StoreDownloaderExtension, wenn Sie den Schlüssel BAUsesAppleHosting auf YES setzen; andernfalls verwenden Sie das Background-Assets-Protokoll ManagedDownloaderExtension.” Diese Zuordnung dokumentiert die Kombination „verwaltet, selbst gehostet”, die die Anleitungsartikel nicht durchgängig behandeln. 

  8. Apple, BAUsesAppleHosting und BAAppGroupID, Referenz „Information Property List”. Bei beiden steht iOS 26.0, iPadOS 26.0, macOS 26.0, tvOS 26.0 und visionOS 26.0. Zu beachten: BAAppGroupID, BAHasManagedAssetPacks und BAUsesAppleHosting tragen jeweils eine abweichende Zeile mit Mac Catalyst 16.0 neben ihren 26.0-Zeilen für alle anderen Plattformen; die Untergrenze iOS 26.0 für die verwaltete Stufe stützt sich auf AssetPackManager, ManagedDownloaderExtension und BAHasManagedAssetPacks, nicht auf BAAppGroupID, das auch der unverwaltete Weg benötigt. 

  9. Apple, Configuring an unmanaged Background Assets project, Background Assets. Quelle für den Erweiterungstyp Self-Hosted, Unmanaged, für die Anforderung von App Groups auf beiden Targets, für den Download-Ablauf bei Installation und Update sowie für die Zuständigkeitsaussage: „Es liegt in Ihrer Verantwortung, Manifestdateien für Ihre selbst gehosteten, unverwalteten Assets zu erstellen (in einem Format Ihrer Wahl), die Ihr Code parst, um dem System die URLs und Dateigrößen zu liefern.” Außerdem Quelle für BAManifestURL, BAInitialDownloadRestrictions, BADownloadAllowance und BAEssentialDownloadAllowance (komprimierte Größen), BAMaxInstallSize und BAEssentialMaxInstallSize (unkomprimierte Größen) sowie BADownloadDomainAllowList (Domains im DNS-Format, optional mit führendem Sternchen als Platzhalter). BADownloaderExtension ist ab iOS 16.1, iPadOS 16.1, Mac Catalyst 16.1, macOS 13.0, tvOS 18.4 und visionOS 2.4 verfügbar, BAManifestURL ab iOS 16.1. 

  10. Apple, setPreservationPriority(_:forTags:) und preservationPriority(forTag:), Foundation. Beide eingeführt mit iOS 9.0 und veraltet ab 27.0 unter iOS, iPadOS, Mac Catalyst, tvOS, visionOS und watchOS. Quelle für „Ein Hinweis an das System auf die relative Reihenfolge, in der mit Tags versehene Ressourcengruppen im Bundle entfernt werden”. 

  11. Apple, Downloading Apple-hosted asset packs, Background Assets, zusammen mit Creating managed asset packs. Quelle für die Vorlage der Background-Download-Erweiterung und deren Typ Apple-Hosted, Managed, für die Anforderung einer gemeinsamen App Group, für die Property-List-Konfiguration mit drei Schlüsseln samt der Anweisung, „alle anderen Information-Property-List-Schlüssel von Background Assets wegzulassen”, für die Befehle xcrun ba-package template und xcrun ba-package, für die Manifestschlüssel (assetPackID, downloadPolicy, installationEventTypes mit firstInstallation und subsequentUpdate, fileSelectors mit file und directory sowie platforms), für die drei Download-Richtlinien (essential, prefetch und onDemand) und ihr Verhalten bei der Installation, für die Regel, dass Pfade relativ zum Packaging-Verzeichnis aufgelöst werden, für den zusammengeführten Namensraum („Das System führt alle Ihre Asset Packs automatisch in einem gemeinsamen Namensraum zusammen und rekonstruiert damit Ihren Asset-Wurzelordner so, als wäre er auf das Gerät einer Person kopiert worden”), für speicherabgebildete Data-Lesezugriffe und die Variante mit Dateideskriptor, für die Upload-Wege (Transporter, altool, iTMSTransporter und die App Store Connect API) sowie für die Speicheranweisung: „Das System entfernt Ihre Asset Packs nicht automatisch, solange Ihre App installiert ist. Rufen Sie deshalb die Methode remove(assetPackWithID:) auf, wenn Sie ein Asset Pack nicht mehr benötigen.” Die Download-Beispiele des Artikels rufen sowohl assetPack(withID:) auf, das Apples Verfügbarkeitsdaten ab 27.0 als veraltet ausweisen, als auch ensureLocalAvailability(of:), veraltet ab 26.4 (siehe Anmerkung 19). 

  12. Apple, Apple-hosted asset pack size limits, App Store Connect Help. Gesamtvolumen der Asset Packs 200 GB; Anzahl der Asset Packs 200. Quelle für „die Gesamtsumme der Größennutzung aller Asset Packs, die zu einem App-Datensatz in App Store Connect hochgeladen wurden”, für die Berechnungsmethode (maximale Größe über die Versionen, die für TestFlight oder die Verbreitung im App Store infrage kommen, ohne die Status „Awaiting Upload”, „Processing”, „Failed” und vollständig „Superseded”), für die E-Mail-Benachrichtigung bei 80 %, für „Diese Grenzen werden über alle für Ihre App angebotenen Plattformen hinweg geteilt” und für das Verhalten beim Archivieren, das „alle Versionen eines Asset Packs aus App Store Connect entfernt, einschließlich der in TestFlight getesteten und der im App Store live geschalteten”. 

  13. Apple, Overview of Apple-hosted asset packs, App Store Connect Help. Quelle für den vierstufigen Ablauf (packen, hochladen, über TestFlight testen, beim App Review einreichen), für die Unabhängigkeit der Asset Packs von den App-Builds und für die Liste der unterstützten Plattformen — iOS 26+, iPadOS 26+, macOS 26+, tvOS 26+ und visionOS 26+ — bei verwalteten, von Apple gehosteten Assets. 

  14. Apple, ManagedDownloaderExtension, Background Assets. Protokoll, iOS 26.0 und höher auf allen sechs aufgeführten Plattformen. Liefert Standardimplementierungen für jede geerbte Anforderung aus BADownloaderExtension, verbunden mit der Warnung, die geerbten Anforderungen nicht selbst zu implementieren — abgesehen von optional backgroundDownload(_:didReceive:)

  15. Apple, AssetPackManager, Background Assets. Actor, iOS 26.0, iPadOS 26.0, Mac Catalyst 26.0, macOS 26.0, tvOS 26.0 und visionOS 26.0. Quelle für den Hinweis zum Opt-in („Sobald Ihr Code zum ersten Mal auf den gemeinsamen Manager verweist, geht Background Assets davon aus, dass Ihre App sich für die automatische Systemverwaltung Ihrer Asset Packs entscheidet”) und für die Kopplungsanforderung: Den Manager ohne das passende verwaltete Erweiterungsprotokoll zu verwenden, ist „ein Programmierfehler”. Außerdem Quelle für checkForUpdates(), das „die neuesten Asset-Pack-Informationen vom Server abruft, veraltete Asset Packs aktualisiert und obsolete Asset Packs entfernt”, sowie für remove(assetPackWithID:), url(for:) (nonisolated, nimmt einen FilePath und liefert eine URL) und statusUpdates(forAssetPackWithID:) — keines davon ist als veraltet markiert. AssetPack und ManagedBackgroundAssetsError tragen dieselbe Verfügbarkeit ab iOS 26.0. Zu den abgekündigten Mitgliedern des Managers siehe Anmerkung 19. 

  16. Apple, StoreDownloaderExtension, StoreKit. Protokoll, das ManagedDownloaderExtension verfeinert; verfügbar ab iOS 26.0, iPadOS 26.0, macOS 26.0, tvOS 26.0 und visionOS 26.0. 

  17. Apple, Testing asset packs locally, Background Assets. Quelle für die HTTPS-Anforderung, für die Root-CA-Abfolge in der Schlüsselbundverwaltung, für die Erstellung des Apple-Configurator-Profils samt Installation und Vertrauensstellung auf jedem Gerät, für das SSL-Leaf-Zertifikat, dessen Name „eine gültige IP-Adresse, ein Hostname oder ein Domainname” sein und zum Server passen muss, für den Befehl xcrun ba-serve und für die URL-Überschreibung in den Entwicklereinstellungen (Einstellungen > Entwickler > Entwicklungsüberschreibungen unter iOS, iPadOS, tvOS und visionOS; xcrun ba-serve url-override unter macOS). 

  18. Apple, BAEssentialMaxInstallSize und BAMaxInstallSize, Referenz „Information Property List”. BAEssentialMaxInstallSize ab iOS 18.0, BAMaxInstallSize ab iOS 16.0. Bei beiden steht: „Der App Store zeigt anhand dieses Schlüssels die Größe Ihrer App auf der Produktseite an; geben Sie deshalb einen genauen Wert an. Wenn Sie die Assets komprimieren, verwenden Sie hier die unkomprimierte Größe der Dateien. Überschätzen Sie den benötigten Speicherplatz nicht.” Beide sind als erforderlich für die Nutzung von Background Assets gekennzeichnet. 

  19. Apples Verfügbarkeitsmetadaten zu den Mitgliedern von AssetPackManager, gelesen aus Apples Dokumentations-JSON am 25. Juli 2026. Als veraltet markierte Mitglieder, alle eingeführt mit iOS 26.0: ensureLocalAvailability(of:) veraltet ab 26.4; status(ofAssetPackWithID:) veraltet ab 26.4 zugunsten von status(relativeTo:); assetPack(withID:) veraltet ab 27.0 mit dem Hinweis „Rufen Sie assetPack(withID:) auf dem Wert der Eigenschaft manifest des Managers auf”; und allAssetPacks veraltet ab 27.0 zugunsten der Eigenschaft assetPacks des Manifests. Mit iOS 27.0 eingeführte Ersatzsymbole, im aktuellen SDK als Beta gekennzeichnet: manifest, AssetPackManifest.assetPack(withID:) (synchron, liefert ein optionales AssetPack) und ensureLocalAvailability(of:requireLatestVersions:). ensureLocalAvailability(of:requireLatestVersion:) kam mit 26.4 und ist nicht veraltet. Die Beobachtung, dass Apples Anleitung zum Hosting durch Apple weiterhin zwei abgekündigte Aufrufe vorführt, assetPack(withID:) und ensureLocalAvailability(of:), stammt vom Autor und beruht auf einem Abgleich des Artikeltextes mit der Symbolverfügbarkeit am selben Tag. 

  20. Erhebung des Autors über sieben ausgelieferte Projekte am 25. Juli 2026: Reps, Return, Banana List, Ace Citizenship, Water, ResumeGeni und Yawara. Durchsucht wurden alle Swift-, Objective-C-, Header-, Property-List- und project.pbxproj-Dateien, unter Ausschluss von build, DerivedData, .build, Pods und .git, nach NSBundleResourceRequest, beginAccessingResources, setPreservationPriority, On Demand Resources, jeder ON_DEMAND_RESOURCES-Build-Einstellung, knownAssetTags und ASSETCATALOG_COMPILER_*TAG-Einstellungen. Null Treffer bei jedem Muster in jedem Projekt und null Treffer für Background-Assets-Symbole. Die Gesamtgrößen der Asset-Kataloge wurden mit du über alle .xcassets-Verzeichnisse gemessen, ohne Build-Ausgaben, Fastlane-Screenshots und Report-Verzeichnisse: Return 66,62 MB, Ace Citizenship 7,81 MB, Banana List 2,04 MB, Reps 1,66 MB, Water 0,04 MB und Yawara 0,01 MB. IPHONEOS_DEPLOYMENT_TARGET-Werte aus den jeweiligen project.pbxproj-Dateien: Reps 26.0 und 26.2, Return 26.1, Banana List 26.0, Water 26.0, Yawara 26.5 sowie Ace Citizenship 17.0, 17.5 und 26.1 über seine Targets hinweg. 

  21. Apple, Reducing download and storage demands with localized asset packs, Background Assets. Quelle für die Kennzeichnung language, die Asset Packs in macOS 27, iOS 27, tvOS 27 und visionOS 27 hinzugefügt wurde, für die Regeln zu BCP-47-Bezeichnern (nur Sprach-, Regions- und Schrift-Subtags, keine Varianten oder Erweiterungen) und für den Schlüssel language in der Xcode-27-Vorlage. 

Verwandte Beiträge

canOpenURL ist veraltet: Was Sie stattdessen aufrufen

Apple hat canOpenURL in drei Sätzen abgekündigt und die Scheme-Positivliste auf 25 Einträge halbiert. Der Ersatz kann ei…

23 Min. Lesezeit

Die Social-Media-Checkbox des App Store und was sie kostet

Ab September verlangt der App Store eine Angabe zu Social-Media-Funktionen. Die Ausnahme für unter 13-Jährige kostet Ent…

24 Min. Lesezeit