On Demand Resources Is Deprecated: What Background Assets Costs

Apple retired a decade-old content delivery system in 13 words: “On Demand Resources and the NSBundleResourceRequest API are deprecated. Use Background Assets instead.”1

That sentence is the complete entry. It carries radar 170066290, sits under Deprecations, and repeats verbatim in three separate release notes.123 Apple published no removal version, no migration guide keyed to the deprecation, and no companion note in the macOS or watchOS release notes.

The work hides in the last four words. Background Assets is not one thing. It forks into three configurations with different hosting models, different minimum deployment targets, and migration costs separated by roughly an order of magnitude. The choice happens before you write a line of code, and picking wrong is the expensive mistake.

TL;DR

  • Apple deprecated On Demand Resources and NSBundleResourceRequest in the iOS and iPadOS 27, tvOS 27, and visionOS 27 release notes.123 ODR keeps working. Apple named no removal date, and the deprecated APIs still ship and still resolve tags.
  • The API’s own availability data deprecates it on six platforms, two more than any release note mentions: Mac Catalyst and watchOS.4 Background Assets publishes no watchOS availability at all, so watchOS receives a deprecation with no documented replacement.56
  • “Use Background Assets instead” forks three ways: managed with Apple hosting, managed with your own hosting, and unmanaged. Both managed paths require iOS 26.0 as a minimum deployment target.78 Below 26.0 only the unmanaged path is open, and it requires you to host the files, invent the manifest format, and parse it yourself.9
  • Disk management inverts. ODR let the system purge unused tagged resources and took setPreservationPriority(_:forTags:) as a hint about ordering.410 Background Assets keeps every downloaded pack on device until your code calls remove(assetPackWithID:).11
  • Apple hosts up to 200 GB of compressed asset packs and up to 200 packs per app record, shared across every platform your app offers, uploaded to App Store Connect and reviewed separately from builds.1213

What Apple deprecated, precisely

Three details in the note carry weight, and the note states none of them.

Scope is wider than the release notes. Three documents carry the entry: iOS and iPadOS 27, tvOS 27, and visionOS 27, each under an On Demand Resources heading with a Deprecations subheading, each citing the same radar.123 The macOS 27 and watchOS 27 notes say nothing about it.

The API’s availability annotation tells a wider story. NSBundleResourceRequest reads as introduced in iOS 9.0 and deprecated in 27.0, with the identical 27.0 deprecation on iPadOS 9.0, Mac Catalyst 13.1, tvOS 9.0, visionOS 1.0, and watchOS 2.0.4 Six platforms in the metadata, four named across the notes. Bundle’s two preservation-priority methods carry the same six-platform annotation.10 An audit driven by release notes alone misses the Mac Catalyst and watchOS entries entirely.

The Mac Catalyst entry is nominal. Apple documents that NSBundleResourceRequest “ignores calls from Mac apps built with Mac Catalyst,” so the deprecation retires an API that never did anything there.4 The watchOS entry is not nominal. Background Assets lists availability for iOS 16.0, iPadOS 16.0, Mac Catalyst 16.0, macOS 13.0, tvOS 18.4, and visionOS 2.4, with no watchOS row.5 Apple states plainly that Apple-hosted asset packs are “available for apps distributed through the App Store on all platforms except watchOS.”6 A watchOS app using ODR gets a deprecation warning and no replacement to migrate to.

Force is the weakest of the three 27-cycle changes I have covered. Deprecated means deprecated. Apple published no removal version, no submission gate, and no runtime failure. Compare the same cycle’s scene life cycle mandate, where apps built with the new SDK “fail to launch,” or the launch screen requirement, where the App Store rejects the build outright. ODR does neither. Existing tags keep resolving, existing calls keep returning resources, and shipped binaries keep working. What arrives is a compiler warning and a clock nobody can read.

Timing reads as a decision, not a cleanup. Apple deprecated the API across four platform names at once, one release after the managed tier of its replacement shipped. Treat the deprecation as the opening of a migration window whose length Apple has not published, and not as an emergency.

The fork you take before writing code

Apple’s framework overview describes two hosting models and a managed default that “handles downloads, updates, compression, and more for you.” For Apple hosting, “you upload your assets to App Store Connect and maintain them there, similar to app builds.”5 Xcode’s Background Download extension template names two types directly, Apple-Hosted, Managed and Self-Hosted, Unmanaged.911 A third combination exists in the property list keys: BAHasManagedAssetPacks set to YES without BAUsesAppleHosting selects managed asset packs that you host yourself, and its documentation routes you to the ManagedDownloaderExtension protocol rather than StoreKit’s StoreDownloaderExtension.7814

Apple-Hosted, Managed Managed, self-hosted Self-Hosted, Unmanaged
Minimum iOS 26.0715 26.0714 16.19
Who hosts the files Apple, via App Store Connect6 You You
Manifest format Apple’s JSON schema11 Apple’s JSON schema11 Yours to invent and parse9
Extension protocol StoreDownloaderExtension716 ManagedDownloaderExtension714 BADownloaderExtension9
Downloads, updates, compression System5 System5 You9
Property list keys 311 Not documented end to end7 4 top-level, one holding 3 more9

The deployment target decides for most teams. Every managed entry point requires at least iOS 26.0, from AssetPackManager and ManagedDownloaderExtension down to the three property list keys.781415 An app supporting iOS 18 cannot adopt the managed tier at all, and its options narrow to the unmanaged path, which reaches back to iOS 16.1, or staying on deprecated ODR until the deployment target moves.9

The unmanaged path is a different job. Apple’s sequence has the system download a manifest from BAManifestURL before your app launches, hand the file to your extension, and take back a set of download requests.9 Apple states the division without hedging: “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 You supply hosting, a CDN, a manifest schema, a parser, and a domain allowlist. Anyone reading “use Background Assets instead” as an API swap is reading the managed tier and quoting the unmanaged bill.

What ODR gave you that you rebuild by hand

Three ODR behaviors have no drop-in equivalent.

Tags become asset packs. ODR identified content with string tags assigned in Xcode, and NSBundleResourceRequest(tags:) claimed one or more of them.4 Background Assets replaces tags with asset packs: directories of files described by a JSON manifest, compressed into a .aar archive by a command-line tool. The unit of granularity grows, and the assignment moves out of Xcode’s asset catalog into a file you maintain.

Apple hosting becomes a separate release train. ODR content rode along with the build. Apple-hosted asset packs upload independently through Transporter, altool, iTMSTransporter, or the App Store Connect API, and you submit them for App Review separately from the app.1113 The decoupling is the feature: you ship new content without shipping a build. The cost is a second submission pipeline, a second review queue, and a second set of statuses to monitor.

Automatic purging becomes your job, and the inversion is the sharpest change. ODR treated downloaded content as a cache the system owned. Apple documented that the system “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,” which is a promise about when purging happens rather than whether.4 setPreservationPriority(_:forTags:) existed precisely to give “a hint to the system of the relative order for purging tagged sets of resources in the bundle.”10 You ended your claim, the system reclaimed the space on its own schedule, and low-storage handling was Apple’s problem.

Background Assets reverses the ownership. The system keeps packs updated automatically, and checkForUpdates() removes packs that went obsolete on the server.15 Neither mechanism evicts a pack you simply finished with. Apple’s instruction is explicit: “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

The scoped, reference-counted pattern collapses into an explicit delete you have to decide to call:

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

Every app carrying an ODR eviction assumption needs a storage policy written for it. The failure mode is quiet: nothing crashes, nothing warns, and device storage climbs until a user notices your app in the storage list.

The migration surface, item by item

For the Apple-hosted managed path, Apple’s own steps produce this checklist.

Group files into asset packs and pick a download policy per pack. Three policies exist. essential downloads during installation and contributes to the progress people watch in the App Store, in TestFlight, and on the Home Screen. prefetch starts during installation and continues in the background after installation finishes. onDemand downloads only when your code asks.11 For essential and prefetch, a nested installationEventTypes array takes firstInstallation, subsequentUpdate, or both, so a tutorial pack can download on first install and skip every later update.11

Write a manifest per pack. Xcode generates an annotated template:

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

File paths resolve relative to the directory where you run the packaging command, which matters again later when you read files back by path.11 Archive each pack:

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

Add a Background Download extension target under Application Extension, choosing Apple-Hosted, Managed as the type. Add the App Groups capability to both the app and the extension, and put both in the same group. Then add three property list keys to the app target: BAAppGroupID, BAHasManagedAssetPacks set to YES, and BAUsesAppleHosting set to YES. Apple instructs you to omit every other Background Assets key for Apple-hosted projects.11 One constraint is easy to trip over: adopting AssetPackManager without also adopting the matching extension protocol is, in Apple’s words, “a programmer error.”15

Reading files back works through a merged namespace. 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,” so code addresses files by path without tracking which pack holds them.11 Reads return memory-mapped Data by default, with a file-descriptor variant for procedural loading that you must close yourself.11

Local testing carries a setup cost worth budgeting separately. Background Assets uses HTTPS for every download, so the mock server needs a certificate. Apple’s documented path runs through Keychain Access to create a self-signed root CA, Apple Configurator to build a profile carrying that CA, installing and trusting the profile on every test device, issuing an SSL leaf certificate whose name matches the server’s IP address or hostname exactly, starting the server, and setting a URL override in Developer settings on each device.17

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

Budget that sequence as its own task. On Demand Resources needed no server of yours at any point: Apple describes it as a manager for “content hosted on the App Store,” and resources missing from the device “are requested from the App Store.”4 Migrating means standing up hosting, or a trusted mock of it, before you can exercise a single download. Reading the two workflows side by side, I expect the certificate chain rather than the API adoption to consume the first day of a migration.

The numbers to plan against

Apple publishes two hard ceilings for Apple-hosted packs: 200 GB total and 200 asset packs per app record. Both are “shared across all platforms offered for your app.”12 Apple computes the total from the maximum size across versions eligible for TestFlight or App Store distribution, excluding Awaiting Upload, Processing, Failed, and fully Superseded versions, and emails you at 80% of the limit. Archiving a pack recovers space by removing all of its versions, including versions live on the App Store.12

The unmanaged path replaces those ceilings with four top-level property list keys you set yourself, one of them a dictionary carrying three more, and the compressed-versus-uncompressed split is a genuine trap. BADownloadAllowance and BAEssentialDownloadAllowance bound download sizes and take compressed values. BAMaxInstallSize and BAEssentialMaxInstallSize bound installed sizes and take uncompressed values.9 Apple attaches a warning to the install-size keys that is really a product warning: “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 completes the set, accepting DNS-format domains with an optional leading asterisk for wildcards.9

One more number belongs in the plan, and it comes from availability metadata rather than prose. AssetPackManager shipped at iOS 26.0, and four of its members already carry deprecations: ensureLocalAvailability(of:) and status(ofAssetPackWithID:) at 26.4, then assetPack(withID:) and allAssetPacks at 27.0.19 Lookup, status, and the download call each moved once, across two point releases. The route Apple now points to, through the manager’s manifest property, carries a beta annotation in the 27.0 SDK, as does the batching ensureLocalAvailability(of:requireLatestVersions:).19 Apple’s own Apple-hosted walkthrough still demonstrates two of the deprecated calls.11 The practical floor therefore sits above the tier’s nominal 26.0. Writing the download path shown earlier without collecting a deprecation warning means targeting 27.0, and accepting beta-annotated symbols to do it. The replacement you are being told to adopt is younger and moving faster than the API it replaces.

Who the deprecation actually catches

The affected population is narrow, and I could not find it in my own code. I searched seven shipping projects for NSBundleResourceRequest, beginAccessingResources, setPreservationPriority, any ON_DEMAND_RESOURCES build setting, knownAssetTags, and asset-catalog tag configuration. Zero hits, in all seven, on every pattern. A repository-wide sweep of every Swift, Objective-C, property list, and pbxproj file under my projects directory returned nothing for any ODR symbol, and nothing for Background Assets either.20

The null result has a cause worth naming, because it generalizes. ODR exists for apps whose content dwarfs their code. My largest asset catalog belongs to Return at 66.6 MB, and every other app sits under 8 MB, with Water and Yawara under 100 KB.20 At those sizes, splitting content into packs adds network failure modes, a storage policy, and a second review pipeline while saving a download nobody complains about. The apps that genuinely need Background Assets are games with level content, apps shipping large machine-learning models, and anything with per-language video, which is exactly the population Apple’s localized asset pack support in iOS 27 targets.21

Deployment targets sharpen the picture, and they are the number to check first in any codebase. Five of my six iOS apps already sit at iOS 26.0 or later, so the managed tier would be available to them today. Ace Citizenship still declares 17.0 and 17.5 on some of its targets, which would rule out the managed tier and leave only the unmanaged path or deprecated ODR.20 Run that check before designing anything: the minimum deployment target, not the asset payload, is what decides which migration you are actually being offered.

FAQ

Does On Demand Resources stop working in iOS 27?

No. Apple marked ODR and NSBundleResourceRequest deprecated and published no removal version, no submission gate, and no runtime failure.1 Deprecated APIs continue to function, and existing tags keep resolving. What you get is a compiler warning. The contrast with the same cycle’s other breaking changes is instructive: the scene life cycle mandate makes apps “fail to launch,” and the launch screen requirement makes the App Store reject the build. The ODR deprecation starts a clock rather than closing a door.

Which platforms does the deprecation cover?

The release notes name four platforms across three documents: iOS and iPadOS 27, tvOS 27, and visionOS 27, all citing radar 170066290.123 The API’s availability metadata is broader, marking NSBundleResourceRequest and Bundle’s preservation-priority methods deprecated at 27.0 on six platforms, adding Mac Catalyst and watchOS.410 Mac Catalyst is academic because Apple documents that the class ignores calls from Catalyst apps.4 watchOS is not academic: Background Assets publishes no watchOS availability, and Apple-hosted packs are available “on all platforms except watchOS,” so a watchOS app has a deprecated API and no documented successor.56

Can I migrate if my app supports iOS 18?

Not to the managed tier. AssetPackManager, ManagedDownloaderExtension, BAHasManagedAssetPacks, and BAUsesAppleHosting all require iOS 26.0.781415 Two options remain below that floor. The unmanaged path works from iOS 16.1, and it asks you to host the assets, define your own manifest format, parse it in an extension, and declare download allowances and a domain allowlist in your property list.9 Otherwise, keep using deprecated ODR until your deployment target reaches 26.0, which Apple’s lack of a removal date currently permits.

What breaks quietly if I port ODR code straight across?

Storage. ODR let the system purge unused tagged content, and setPreservationPriority(_:forTags:) only hinted at ordering.410 Background Assets never removes a pack you are finished with while your app stays installed, so the space is yours until you call remove(assetPackWithID:).11 Code that mirrors the old beginAccessingResources and endAccessingResources pattern without adding an explicit delete leaks disk indefinitely, with no crash and no warning to catch it in testing. Write the eviction policy before you write the download code.

Key Takeaways

For iOS developers: - Check the minimum deployment target before anything else. Below iOS 26.0, the managed tier does not exist for you, and “use Background Assets instead” means building hosting, a manifest format, and a parser on the unmanaged path.79 - Write an eviction policy as part of the migration. remove(assetPackWithID:) has no automatic counterpart, and the ODR habit of releasing a claim and trusting the system leaves storage growing silently.11

For teams shipping large content: - Budget the local testing setup separately from the code. Apple’s documented path runs through a self-signed root CA, an Apple Configurator profile installed and trusted on each device, an SSL leaf certificate matching the server hostname, and a per-device URL override.17 - Plan against 200 GB and 200 packs per app record, shared across every platform your app ships on, and watch for the email Apple sends at 80%.12 Archiving to recover space removes versions that are live on the App Store.12

For release managers: - Apple-hosted packs mean a second submission pipeline: uploaded through Transporter or the App Store Connect API, versioned independently of builds, and submitted to App Review on their own.1113 Staff the review cycle accordingly. - Nothing forces the migration this cycle. Sequence ODR behind the scene life cycle mandate and the launch screen requirement, both of which carry real enforcement, and revisit when Apple publishes a removal version.


The 27 cycle keeps sorting its breaking changes by teeth: the scene life cycle stops apps from launching, the launch screen stops builds from shipping, and ODR merely starts a clock. Knowing which is which is how you spend the cycle well. For the same pattern on a smaller surface, see ImageCreator’s removal from Image Playground. The full series hub is the Apple Ecosystem Series.

References


  1. Apple, iOS & iPadOS 27 Release Notes, On Demand Resources section, Deprecations (radar 170066290): “On Demand Resources and the NSBundleResourceRequest API are deprecated. Use Background Assets instead.” Verified against Apple’s documentation JSON on July 25, 2026. The entry is the complete text; the release notes contain no removal version, no submission requirement, and no runtime-failure language for On Demand Resources. 

  2. Apple, tvOS 27 Release Notes, On Demand Resources section, Deprecations (radar 170066290). Identical wording to the iOS and iPadOS note. 

  3. Apple, visionOS 27 Release Notes, On Demand Resources section, Deprecations (radar 170066290). Identical wording. The macOS 27 and watchOS 27 release notes contain no corresponding entry, verified by searching their documentation JSON on July 25, 2026. 

  4. Apple, NSBundleResourceRequest, Foundation. Availability: iOS 9.0, iPadOS 9.0, Mac Catalyst 13.1, tvOS 9.0, visionOS 1.0, and watchOS 2.0, each deprecated at 27.0. Source of the tag model (“You identify on-demand resources during development by creating string identifiers known as tags”), the purge behavior (“The system 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”), the Mac Catalyst note (“This class ignores calls from Mac apps built with Mac Catalyst”), and the single-use constraint. Member APIs init(tags:), beginAccessingResources(completionHandler:), and endAccessingResources() carry the same six-platform 27.0 deprecation. 

  5. Apple, Background Assets, framework overview. Availability: iOS 16.0, iPadOS 16.0, Mac Catalyst 16.0, macOS 13.0, tvOS 18.4, and visionOS 2.4, with no watchOS row. Source of “The default implementation of Managed Background Assets handles downloads, updates, compression, and more for you” and “If you choose Apple-Hosted Background Assets, you upload your assets to App Store Connect and maintain them there, similar to app builds.” 

  6. Apple, Creating managed asset packs, Background Assets. Source of “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.” 

  7. Apple, BAHasManagedAssetPacks, Information Property List reference. Boolean, iOS 26.0, iPadOS 26.0, macOS 26.0, tvOS 26.0, and visionOS 26.0. Source of the extension-protocol routing: “use the StoreKit StoreDownloaderExtension protocol if you set the BAUsesAppleHosting key to YES; otherwise, use the Background Assets ManagedDownloaderExtension protocol.” The routing documents the managed, self-hosted combination that the walkthrough articles do not cover end to end. 

  8. Apple, BAUsesAppleHosting and BAAppGroupID, Information Property List reference. Both read iOS 26.0, iPadOS 26.0, macOS 26.0, tvOS 26.0, and visionOS 26.0. Note that BAAppGroupID, BAHasManagedAssetPacks, and BAUsesAppleHosting each carry an anomalous Mac Catalyst 16.0 row alongside their 26.0 rows for every other platform; the iOS 26.0 floor for the managed tier rests on AssetPackManager, ManagedDownloaderExtension, and BAHasManagedAssetPacks rather than on BAAppGroupID, which the unmanaged path also requires. 

  9. Apple, Configuring an unmanaged Background Assets project, Background Assets. Source of the Self-Hosted, Unmanaged extension type, the App Groups requirement on both targets, the install-and-update download sequence, and the responsibility statement: “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.” Also the source for BAManifestURL, BAInitialDownloadRestrictions, BADownloadAllowance and BAEssentialDownloadAllowance (compressed sizes), BAMaxInstallSize and BAEssentialMaxInstallSize (uncompressed sizes), and BADownloadDomainAllowList (DNS-format domains, optional leading asterisk for wildcards). BADownloaderExtension is available from iOS 16.1, iPadOS 16.1, Mac Catalyst 16.1, macOS 13.0, tvOS 18.4, and visionOS 2.4; BAManifestURL from iOS 16.1. 

  10. Apple, setPreservationPriority(_:forTags:) and preservationPriority(forTag:), Foundation. Both introduced at iOS 9.0 and deprecated at 27.0 across iOS, iPadOS, Mac Catalyst, tvOS, visionOS, and watchOS. Source of “A hint to the system of the relative order for purging tagged sets of resources in the bundle.” 

  11. Apple, Downloading Apple-hosted asset packs, Background Assets, together with Creating managed asset packs. Source of the Background Download extension template and its Apple-Hosted, Managed type, the shared app group requirement, the three-key property list configuration with the instruction to “omit all other Background Assets information property list keys,” the xcrun ba-package template and xcrun ba-package commands, the manifest keys (assetPackID, downloadPolicy, installationEventTypes with firstInstallation and subsequentUpdate, fileSelectors with file and directory, and platforms), the three download policies (essential, prefetch, and onDemand) and their installation behavior, the paths-relative-to-packaging-directory rule, the merged namespace (“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”), memory-mapped Data reads and the file-descriptor variant, the upload channels (Transporter, altool, iTMSTransporter, and the App Store Connect API), and the storage instruction: “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.” The article’s download examples call both assetPack(withID:), deprecated at 27.0, and ensureLocalAvailability(of:), deprecated at 26.4, which Apple’s own availability data marks deprecated at 26.4 (see note 19). 

  12. Apple, Apple-hosted asset pack size limits, App Store Connect Help. Asset pack total 200 GB; asset pack count 200. Source of “The total sum of size usage for all asset packs uploaded to an app record in App Store Connect,” the calculation method (maximum size over versions eligible for TestFlight or App Store distribution, excluding Awaiting Upload, Processing, Failed, and fully Superseded versions), the 80% email notification, “These limits are shared across all platforms offered for your app,” and the archiving behavior, which “removes all versions of an asset pack from App Store Connect, including those being tested in TestFlight and live on the App Store.” 

  13. Apple, Overview of Apple-hosted asset packs, App Store Connect Help. Source of the four-step workflow (package, upload, test through TestFlight, submit to App Review), the independence of asset packs from app builds, and the supported platform list of iOS 26+, iPadOS 26+, macOS 26+, tvOS 26+, and visionOS 26+ for managed Apple-hosted assets. 

  14. Apple, ManagedDownloaderExtension, Background Assets. Protocol, iOS 26.0 and later on all six listed platforms. Provides default implementations for every inherited BADownloaderExtension requirement, with a warning not to implement the inherited requirements apart from, optionally, backgroundDownload(_:didReceive:)

  15. Apple, AssetPackManager, Background Assets. Actor, iOS 26.0, iPadOS 26.0, Mac Catalyst 26.0, macOS 26.0, tvOS 26.0, and visionOS 26.0. Source of the opt-in note (“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”) and the pairing requirement: adopting the manager without the matching managed extension protocol is “a programmer error.” Also the source for checkForUpdates(), which “Gets the latest asset-pack information from the server, updates outdated asset packs, and removes obsolete asset packs,” and for remove(assetPackWithID:), url(for:) (nonisolated, taking a FilePath and returning a URL), and statusUpdates(forAssetPackWithID:), none of which carry a deprecation. AssetPack and ManagedBackgroundAssetsError carry the same iOS 26.0 availability. For the manager members that are deprecated, see note 19. 

  16. Apple, StoreDownloaderExtension, StoreKit. Protocol refining ManagedDownloaderExtension, available iOS 26.0, iPadOS 26.0, macOS 26.0, tvOS 26.0, and visionOS 26.0. 

  17. Apple, Testing asset packs locally, Background Assets. Source of the HTTPS requirement, the Keychain Access root-CA sequence, the Apple Configurator profile creation and per-device install-and-trust steps, the SSL leaf certificate whose name must be “a valid IP address, hostname, or domain name” matching the server, the xcrun ba-serve command, and the Developer settings URL override (Settings > Developer > Development Overrides on iOS, iPadOS, tvOS, and visionOS; xcrun ba-serve url-override on macOS). 

  18. Apple, BAEssentialMaxInstallSize and BAMaxInstallSize, Information Property List reference. BAEssentialMaxInstallSize from iOS 18.0, BAMaxInstallSize from iOS 16.0. Both carry: “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.” Both are marked required to use Background Assets. 

  19. Apple availability metadata for AssetPackManager members, read from Apple’s documentation JSON on July 25, 2026. Deprecated members, all introduced at iOS 26.0: ensureLocalAvailability(of:) deprecated at 26.4; status(ofAssetPackWithID:) deprecated at 26.4 in favor of status(relativeTo:); assetPack(withID:) deprecated at 27.0 with the note “Call assetPack(withID:) on the manager’s manifest property’s value”; and allAssetPacks deprecated at 27.0 in favor of the manifest’s assetPacks property. Replacement symbols introduced at iOS 27.0 and flagged beta in the current SDK: manifest, AssetPackManifest.assetPack(withID:) (synchronous, returning an optional AssetPack), and ensureLocalAvailability(of:requireLatestVersions:). ensureLocalAvailability(of:requireLatestVersion:) arrived at 26.4 and is not deprecated. The observation that Apple’s Apple-hosted walkthrough still demonstrates two deprecated calls, assetPack(withID:) and ensureLocalAvailability(of:), is the author’s, based on comparing the article text against symbol availability on the same date. 

  20. Author’s survey of seven shipping projects on July 25, 2026: Reps, Return, Banana List, Ace Citizenship, Water, ResumeGeni, and Yawara. Searched every Swift, Objective-C, header, property list, and project.pbxproj file, excluding build, DerivedData, .build, Pods, and .git, for NSBundleResourceRequest, beginAccessingResources, setPreservationPriority, On Demand Resources, any ON_DEMAND_RESOURCES build setting, knownAssetTags, and ASSETCATALOG_COMPILER_*TAG settings. Zero matches on every pattern in every project, and zero matches for Background Assets symbols. Asset catalog totals measured with du over all .xcassets directories, excluding build output, fastlane screenshots, and report directories: Return 66.62 MB, Ace Citizenship 7.81 MB, Banana List 2.04 MB, Reps 1.66 MB, Water 0.04 MB, and Yawara 0.01 MB. IPHONEOS_DEPLOYMENT_TARGET values read from each project.pbxproj: Reps 26.0 and 26.2, Return 26.1, Banana List 26.0, Water 26.0, Yawara 26.5, and Ace Citizenship 17.0, 17.5, and 26.1 across its targets. 

  21. Apple, Reducing download and storage demands with localized asset packs, Background Assets. Source of the language designation added to asset packs in macOS 27, iOS 27, tvOS 27, and visionOS 27, the BCP-47 identifier rules (language, region, and script subtags only, no variants or extensions), and the Xcode 27 template’s language key. 

관련 게시물

The App Store's Social Media Checkbox and What It Costs

September's App Store rule makes every submission declare social media capabilities. The under-13 carve-out costs an ent…

30 분 소요

ImageCreator Is Deprecated: What Breaks in iOS 27

Apple is discontinuing Image Playground's ImageCreator class in iOS 27, with TestFlight runtime errors in beta and compi…

9 분 소요