Hello,
I am encountering the following error when uploading a build to App Store Connect:
ITMS-90555: Thinned app size is too large – Your on-demand resources in the universal variant are 30 GB, which exceeds the maximum allowable size. After app thinning, the total size of your on-demand resource asset packs in any variant must be less than 30 GB.
Our application includes a large amount of font resources delivered via ODR.
Before making structural changes, I need clarification because the documentation does not fully explain how ODR size calculations work per variant.
Environment
Xcode: (latest stable)
Distribution method: App Store submission
ODR total size before thinning: approximately (28 GB)
Build processing fails immediately with the ITMS-90555 error
Questions
How exactly does App Thinning compute the size of ODR asset packs per variant?
Is ODR size evaluated:
Per device-specific variant,
Or is the “universal variant” treated as an additional variant that must independently stay under 30GB?
The documentation mentions a 30GB limit per variant, but the universal variant error message is ambiguous.
If device-specific variants are below 30GB but only the “universal variant” exceeds it, is the build still rejected?
In our case:
iPhone-only variants appear to be below the limit,
But the universal variant exceeds 30GB due to aggregated resources.
Is this expected behavior?
Best practices for managing very large ODR sets (e.g., fonts)
Fonts are small individually, but thousands of them produce very large ODR groups.
Is there recommended guidance from Apple for:
Structuring ODR bundles to avoid the universal variant exceeding the limit
Segmenting ODR by device class / feature sets
Any alternative packaging strategies
Are there tools or logs that reveal how App Store Connect decides variant groupings and ODR size?
At the moment, the failure only shows the ITMS-90555 error without further detail.
Case-ID for DTS reference
DTS advised submitting this question here.
Case-ID: 17273913
Any clarification from Apple engineers or community members who have navigated ODR size limits would be greatly appreciated.
Thank you very much!
Background Assets
RSS for tagSchedule background downloads of large assets during app installation, when the app updates, and periodically while the app remains on-device.
Posts under Background Assets tag
29 Posts
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
Hello,
I have a question about when are asset packs actually updated?
For Essential Asset Packs, this only during the keys included in the pack? As in, only when the app is installed for
firstInstallation. And only when there's an app update for subsequentUpdate?
For On Demand Asset Packs, is this only when AssetPackManager.shared.checkForUpdates() is called?
Also, are any asset packs ever actually updated in the background? For example, if an On Demand Asset Pack has an update pushed, can the device automatically fetch and download the pack overnight?
Or is updating limited to only when the app is active?
Hello,
I have an Asset Pack that's a database. I need to use it in 2 apps.
I'm curious at the expected functionality of cross app Asset Pack distribution as I've seen conflicting behavior.
(1) Each app is required to have its own unique Background Assets Target.
(2) Uploading the asset pack requires the App ID to be included.
(3) I'm able to access the Asset Pack of App #1 inside of App #2 by using AssetPackManager.shared.ensureLocalAvailability(of:) with local testing (Not TestFlight)
This is a technical question as originally I planned to duplicate the upload of the Asset Pack to both individual apps.
Can anyone please confirm that Apple-hosted Background Assets still will NOT work unless the app is:
Installed from TestFlight, or
Installed from the App Store
Is it true Xcode-installed builds—Debug or Release—do not receive the App Store’s Background Asset metadata and cannot access the background asset packs?
I am getting the error when running the app in Xcode: The asset pack with the ID “VALIDPACKNAME” couldn’t be looked up: No asset pack with the ID “VALIDPACKNAME” was found.
Regarding the Background Assets capability on iOS:
In the install scenario, resources defined as the "install" type are incorporated into the App Store download progress. Do resources of the "update" type in the update scenario also get incorporated into the App Store download progress in the same way?
If an exception occurs during the download of install-type resources and the download cannot proceed further, will the system no longer actively block users from launching the app and instead enable the launch button?
Currently, if a user has enabled automatic updates on their device, after the app is updated and released on the App Store, will the Background Assets download start immediately once the automatic update completes? Or does Background Assets have its own built-in scheduling logic that prevents it from running concurrently with the automatic update?
Hi everyone,
I’m trying to register fonts system-wide using CTFontManagerRegisterFontURLs with the .persistent scope. The fonts are delivered through Apple-Hosted Background Assets (since On-Demand Resources are deprecated).
Process-level registration works perfectly, but persistent registration triggers a system “Install Fonts” prompt, and tapping Install causes the app to crash immediately.
I’m wondering if anyone has successfully used Apple-Hosted Background Assets to provide persistent, system-wide installable fonts, or if this is a current OS limitation/bug.
What I Expect
Fonts delivered through Apple-Hosted Background Assets should be eligible for system-wide installation
Tap “Install” should install fonts into Settings → Fonts just like app-bundled or ODR fonts
App should not crash
Why This Matters
According to:
WWDC 2019: Font Management and Text Scaling
Developers can build font provider apps that install fonts system-wide, using bundled or On-Demand Resources.
WWDC 2025: Discover Apple-Hosted Background Assets
On-Demand Resources are deprecated, and AHBAs are the modern replacement.
Therefore, persistent font installation via Apple-Hosted Background Assets appears to be the intended path moving forward.
Question
Is this a known limitation or bug in iOS?
Should .persistent font installation work with Apple-Hosted Background Assets?
Do we need additional entitlement, manifest configuration, or packaging rules?
Any guidance or confirmation from Apple engineers would be greatly appreciated.
Additional Info
I submitted a Feedback including a minimal reproducible sample project:
FB21109320
Topic:
App & System Services
SubTopic:
Processes & Concurrency
Tags:
Core Text
Background Assets
Typography
Concurrency
Hi all, I have set up a trivial test project to try Apple-hosted background assets following the instructions in the three articles at https://developer.apple.com/documentation/backgroundassets.
When I run the local mock server with xcrun ba-serve and set the URL override in Settings as described in the "Testing asset packs locally" article, I am able to download a test pack on my iOS devices. On the Mac that I use to run the mock server, however, the same call to AssetPackManager.shared.assetPack(withID: "TestAssetPack") that works on iOS always reports
The asset pack with the ID “TestAssetPack” couldn’t be looked up: No asset pack with the ID “TestAssetPack” was found.
even when not running the mock server, which led me to believe that it may not be hitting it at all. In fact, the macOS app will download asset packs uploaded to App Store Connect even when running the local server and setting the xcrun ba-serve url-override to the exact same string as in Settings on iOS. My initial suspicion was that something is wrong with the URL override, so I have tried all combinations of the Mac's hostname, IP address or "localhost" (with the corresponding SSL certificates) with and without port 443, always prefixing with "https://" for the url-override. All the same.
Does anyone have an idea what may be the issue here?
My asset pack has the following manifest:
{
"assetPackID": "TestAssetPack",
"downloadPolicy": {
"onDemand": {}
},
"fileSelectors": [
{
"file": "TestAsset.txt"
}
],
"platforms": [
"iOS",
"macOS"
]
}
I am running v26.1 for macOS, iOS & Xcode.
Edit:
Just to be clear, my assumption here is that the URL overrides (in Settings on iOS or via ba-serve on macOS) is what should cause the app to hit the mock server. Is that correct or am I missing something?
I read on this documentation :
https://developer.apple.com/help/app-store-connect/reference/app-uploads/on-demand-resources-size-limits
that On Demand Resources a legacy technology.
Does this mean ODR will be deprecated?
If so, when will it officially take effect?
Our application is planning to use it, so we need more information to support our decision.
Hello,
I'm trying to figure out the behavior of AssetPackManager.shared.remove(assetPackWithID: ).
I'm working with MapKit tiles and currently working on trying projecting them correctly which involves serving the AssetPack locally, downloading, checking alignment, and then deleting and changing.
My question is that remove(assetPackWithID: ) completes successfully and the asset pack is removed. This is confirmed by trying to remove the AssetPack again which throws an error.
However, the asset is still appearing on MapKit after the removal. This is a bit odd as this persists not only with force killing, but also restarting the device.
Please advise on how to properly remove an AssetPack.
Thank you
iPhone 15 Pro Max (iOS 26.0.1)
iPhone 17 Pro Max (iOS 26.0.1)
I've followed the setup process to get Apple Hosted Background Assets configured for my project.
(https://developer.apple.com/documentation/backgroundassets/downloading-apple-hosted-asset-packs)
But when I build and run the app I get the following error...
BackgroundAssets/AssetPackManager.swift:174: Fatal error: The process lacks a team ID.
I've checked the Signing->Team for both targets and they both have my Team associated.
Any help or advice would be appreciated...
Hi, anyone managed to make this work? https://developer.apple.com/documentation/backgroundassets
Trying for past few days and can't make it work. Following their official documentation, also this video https://www.youtube.com/watch?v=M3jpgZrB1uo, but it seems I am stuck at:
try await AssetPackManager.shared.ensureLocalAvailability(of: assetPack)
What I did:
Manifest files created, info.plist configured, asset pack created and uploaded to appstoreconnect via transporter, successfully assigned to app and ready for internal testing. Added to my code:
let assetPack = try await AssetPackManager.shared.assetPack(withID: "Tutorial")
try await AssetPackManager.shared.ensureLocalAvailability(of: assetPack)
let videoData = try AssetPackManager.shared.contents(at: "Videos/Introduction.m4v")
but no luck at all....
is anywhere any demo project available to download to compare with my project?
After combing the forums and release nodes, here are some extra notes to help other developers using Apple-Hosted Background Assets. I don't promise I got this perfect, but it may help direct you.
AssetPack.Status is an OptionSet (not an enum!) - Critical API detail missing from guide
It's a bitmask where values can be combined
2⁰ (1) = available to download
2¹ (2) = update available
2² (4) = up to date
2⁶ (64) = downloaded
Example: status value 69 = 0b1000101 = available + up to date + downloaded
Use .contains() method to check specific flags
AssetPack.version property - Undocumented feature
Auto-assigned by App Store Connect for Apple-hosted packs
Increments with each upload of same asset pack ID
No file deduplication across asset packs
Same file in two packs = counts twice toward 200GB limit
Best practice: create separate pack for shared files
Shared namespace path requirements
Asset pack ID is NOT part of file path
Each file must have unique relative path across ALL app's asset packs
Example: Foo/10/239/414.png and Bar/10/239/414.png are distinct and won't collide
Additional url(for:) bugs beyond iOS 26.1 fix
iOS 26 Beta 5: "item with same name already exists" error
Workaround: Request URL for directory, then manually append filename
TestFlight-only availability - Major limitation not mentioned!
Apple-hosted packs currently ONLY work for internal testers on TestFlight or from App Store.
Won't work from Xcode until "later this year"
HTTP 400 errors expected for non-TestFlight installs
ba-serve port workaround
URL override port bug exists on multiple device types
Use ba-serve -p 443 instead of custom ports
Hello,
From the documentation linked below, the limitations for Background Assets are the following:
Size Limit: 200 GB
Asset Pack Count: 100
I'm expecting I will need ~175 Asset Packs and around 500GB of storage.
I understand Background Assets is a new, but is there a process or a potential that these limits will be increased in the future? Or is there a way to request an increase?
I've tried contacting Apple Support as this is more of an Admin issue, however they've directed me here.
Case ID 102725356578
https://developer.apple.com/help/app-store-connect/reference/apple-hosted-asset-pack-size-limits
Thank you,
Tanner
Hello,
I'm trying to use multiple Background Assets Packs to host map tiles.
This is problematic for a few reasons.
MKTileOverlay requires a method that returns a URL.
AssetPackManager.shared.url() throws, but it's unrelated to the url. It will return a URL even if it points to nothing.
There's no name-spacing. Everything appears to be flattened. (See Error below)
Simultaneously, this also is not the case as the documentation states: if there’s a path collision across multiple asset packs, then it’s undefined from which asset pack an individual file will be resolved.
AssetPackManager.shared.url() doesn't have an optional parameter to explicitly declare the asset pack you want to access, like AssetPackManager.shared.contents(at: FilePath) does
For example, I have multiple different tiles I'm trying to overlay for z: 10, x: 239, and y: 414.
Foo/10/239/414.png
Bar/10/239/414.png
And even when explicitly stating the fold directory, it appears that the assets are flattened down. As I'm receiving this error.
The URL for “Foo/10/239/414.png” couldn’t be retrieved: “414.png” couldn’t be copied to “239” because an item with the same name already exists.
I have a Vision Pro app, which I intend to use Apple-Hosted Background Assets for some of my videos after watching:
https://developer.apple.com/videos/play/wwdc2025/325
I added a Apple-Hosted, Managed extension.
New Target -> Background Download -> Apple-Hosted, Managed
After creating an Archive, I tried uploading it to TestFlight, it complains about a DTPlatformName error in my Info.plist. So I added the following :
<key>DTPlatformName</key>
<string>xros</string>
With which, I managed to upload the app with the extension to TestFlight. However, when I tried installing the app on TestFlight to Vision Pro, it gives me an error that says the app cannot be verified.
Any help or pointers is greatly appreciated.
Info.plist
Entitlements
Background Assets can support a maximum of 200G. Will the Apple server perform file comparison? For example, file0 is included in both a.aar file and b.aar file. On the Apple server, does it occupy twice the size of a single file?
I'm successfully creating the AAR file on my system:
Manifest file:
{
"assetPackID": "my-ba",
"downloadPolicy": {
"essential": {
"installationEventTypes": [
"firstInstallation",
"subsequentUpdate"
]
}
},
"fileSelectors": [
{
"file": "file1.bin"
},
{
"file": "file2.bin"
}
],
"platforms": [
"iOS"
]
}
Command:
xcrun /Applications/Xcode-beta.app/Contents/Developer/usr/bin/ba-package my-ba.json -o my-ba.aar
I'm using Transporter on my Sequoia 15.6 system - when I'm uploading the AAR file, I'm getting the following error:
ITMS-91140: Invalid manifest file. Invalid manifest file. Your asset pack’s manifest file can’t be verified. Make sure it follows the manifest template, then upload again.
Full Debug Log:
full-transporter-output.txt
Hi, I'm trying to setup background assets hosted on Apple servers.
I currently have installed Xcode 16.4 and Xcode beta 4.
I have also freshly installed the command line tools for both.
When I run
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
xcrun ba-package template
I get
xcrun: error: sh -c '/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk -find ba-package 2> /dev/null' failed with exit code 17664: (null) (errno=No such file or directory)
xcrun: error: unable to find utility "ba-package", not a developer tool or in PATH
If I try to use Xcode beta 4:
sudo xcode-select -s /Applications/Xcode-beta.app/Contents/Developer
xcrun ba-package template
I get:
dyld[92926]: Library not loaded: /System/Library/PrivateFrameworks/ManagedBackgroundAssetsHelper.framework/Versions/A/ManagedBackgroundAssetsHelper
Referenced from: <7F150064-45BF-31D7-BAFD-32911BB9F569> /Applications/Xcode-beta.app/Contents/Developer/usr/bin/ba-package
Reason: tried: '/System/Library/PrivateFrameworks/ManagedBackgroundAssetsHelper.framework/Versions/A/ManagedBackgroundAssetsHelper' (no such file), '/System/Volumes/Preboot/Cryptexes/OS/System/Library/PrivateFrameworks/ManagedBackgroundAssetsHelper.framework/Versions/A/ManagedBackgroundAssetsHelper' (no such file), '/System/Library/PrivateFrameworks/ManagedBackgroundAssetsHelper.framework/Versions/A/ManagedBackgroundAssetsHelper' (no such file, not in dyld cache)
[1] 92926 abort xcrun ba-package template
Any tip?
On an iPhone running iOS 26 beta 5, url(for: FilePath("subdir/asset.mov")) most always throws this error:
The URL for “subdir/asset.mov” couldn’t be retrieved: “asset.mov” couldn’t be copied to “subdir” because an item with the same name already exists.
Yet, contents(at: FilePath("subdir/asset.mov")) always returns Data for a playable AVMovie.
How can I avoid this url(for:) error?
The asset pack in question is downloaded. The error persists even after pack deletion, redownload, relaunch, and combinations of that.
// Assets repo root
subdir.aar
subdir/asset.mov
subdir/asset_thumb.heic
subdir/Manifest.json
// Manifest.json
{
"assetPackID": "subdir",
"downloadPolicy": {
"onDemand": {}
},
"fileSelectors": [
{
"directory": "subdir",
},
],
"platforms": [
"iOS",
"visionOS"
]
}
xcrun ba-package subdir/Manifest.json -o subdir.aar
xcrun ba-serve --host 192.168.0.10 -p 443 subdir.aar
On macOS Tahoe26.0, iOS 26.0 (23A5287g) not emulator, Xcode 26.0 beta 3 (17A5276g)
Follow this tutorial Testing your asset packs locally The start the test server command I use this command line to start the test server:xcrun ba-serve --host 192.168.0.109 test.aar The terminal showThe content displayed on the terminal is: Loading asset packs…
Loading the asset pack at “test.aar”…
Listening on port 63125…… Choose an identity in the panel to continue. Listening on port 63125…
running the project, Xcode reports an error:Download failed: Could not connect to the server. I use iPhone safari visit this website: https://192.168.0.109:63125, on the page display "Hello, world!"
There are too few error messages in both of the above questions. I have no idea what the specific reasons are.I hope someone can offer some guidance. Best Regards.
{
"assetPackID": "testVideoAssetPack",
"downloadPolicy": {
"prefetch": {
"installationEventTypes": ["firstInstallation", "subsequentUpdate"]
}
},
"fileSelectors": [
{
"file": "video/test.mp4"
}
],
"platforms": [
"iOS"
]
}
this is my Manifest.json