On demand resources

RSS for tag

On-demand resources are app contents that are hosted on the App Store and are separate from the related app bundle that you download.

Posts under On demand resources tag

68 Posts

Post

Replies

Boosts

Views

Activity

ODR Legacy Technology Issues
Hello, We are currently evaluating ways to reduce the app size of the my App. The app contains approximately 200~250 MB of bundled static resources, and we are considering converting these resources into On-Demand Resources(ODR) in order to reduce the initial download and installation size of the app. However, we noticed that ODR is currently marked by Apple as a Legacy Technology. Since we would like these resources to continue being hosted and distributed through Apple CDN / App Store infrastructure, the first alternative we considered is Managed Background Assets, rather than regular Background Assets. We understand that regular Background Assets are available on iOS 16 and later, but they mainly address background download scheduling for apps. What we are specifically looking for is the resource hosting and distribution capability, similar to ODR, where assets can be hosted and delivered through Apple’s infrastructure. This is why we are considering Managed Background Assets. However, my App currently supports devices starting from iOS 14, while the key capabilities of Managed Background Assets require newer iOS versions. As a result, this solution cannot fully cover users who are still on older iOS versions, such as iOS 14 through iOS 18. Given this background, we would like to ask Apple the following questions: Does Apple have any plan to discontinue ODR-related services in the future, especially the App Store-hosted ODR asset download service? If the ODR service is changed or discontinued in the future, would it affect already released App Store apps that rely on ODR asset downloads on older iOS versions? For apps that still need to support iOS 14 and later, while also relying on Apple CDN / App Store infrastructure for resource hosting and distribution, does Apple still recommend using ODR? For apps that cannot immediately raise their minimum supported iOS version to the version required by Managed Background Assets, is there a recommended transition strategy? If ODR services are discontinued in the future, will Apple provide an alternative resource distribution solution that supports older iOS versions, or would developers need to build and maintain their own resource hosting and download system? We would like to better understand the long-term availability and potential risks of using ODR on older iOS versions, so that we can make an appropriate decision for future app size reduction and asset delivery in the App. Thank you.
0
0
82
2w
On-Demand Resources with Initial Install Tags Are Frequently Unavailable at First Launch
Hello, Because our app package size is relatively large, part of our resources needs to be delivered through Apple-hosted asset packs. If we use the Background Assets framework to download these Apple-hosted packs, our app would only be able to support devices running iOS 26 or later. To maintain compatibility with a broader range of iOS versions, we chose to use iOS On-Demand Resources instead. However, during actual use, we found that even when these packs are marked with the initial install tag, there is still a fairly high probability (around 40%) that they are not available on the first screen after the app is launched for the first time. When we try to access them through conditionallyBeginAccessingResourcesWithCompletionHandler, the resources are unavailable, which forces us to download them again. During testing, we added event tracking and found that out of 22 users who downloaded the app, 9 had to re-download these resource packs on first launch. Each of these packs marked with the initial install tag is about 300 MB in size. We have also made sure to follow the NSBundleResourceRequest limitation that no more than 2000 × 1000 × 1000 bytes of resources should be accessed at the same time. We would like to understand why these packs, even though they are marked as initial install, still have such a high probability (around 40%) of being unavailable on the first screen at first launch.
3
0
276
Apr ’26
Read, Write, and Consuming Files / URLs
Hello, I have an asset pack that I'm use to periodically distribute a sqlite database thats being used to an NSPersistentStore. Because the database is over a few GBs, and the files in an AssetPack are not mutable, I have to stream the database into a temporary file, then replace my NSPersistentStore. This requires that the user has 3x the storage available of the database, and permanently uses twice to storage needed. I'd like: To be able to mark a URL/File to be accessible for read/write access To be able to mark a file / URL as consumed when it's no needed. So that it can be cleared from the user storage while still maintaining an active subscription to the asset pack for updates. Thank you
4
0
504
Feb ’26
ITMS-90555: On-Demand Resources exceed 30GB after App Thinning – Need clarification on variant size calculation
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!
2
0
373
Jan ’26
On Demand Resources as Legacy Technology
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.
1
0
479
Nov ’25
On Demand Resources - App Review
After uploading the build to Test Flight, we are successfully able to download the ODR tags. Submitting that same build for an App Review, they are having issues. After further investigation, they are not able to resolve the hostname when trying to download the tag. This failure on the app is causing our app to be rejected. It would be great to get some guidance on how best to resolve this situation for the App Review team. Thanks!
1
0
175
Nov ’25
On Demand Resources does not show an error
I am integrating On Demand Resources into my Unity game. The resources install without any problems if the internet connection is stable: all resources are installed. While testing various scenarios without an internet connection, I encountered the following problem: if I turn off the internet during installation, I don't get any error messages, but if I turn the internet back on, the download no longer continues (and I still don't get an error). If I reopen the application with a stable internet connection, the download will always be at 0%. Please tell me what I am doing wrong. #import "Foundation/Foundation.h" #if ENABLE_IOS_ON_DEMAND_RESOURCES #import "Foundation/NSBundle.h" #endif #include <string.h> struct CustomOnDemandResourcesRequestData; typedef void (*CustomOnDemandResourcesRequestCompleteHandler)(struct CustomOnDemandResourcesRequestData* handler, const char* error); #if ENABLE_IOS_ON_DEMAND_RESOURCES struct CustomOnDemandResourcesRequestData { NSBundleResourceRequest* request; }; extern "C" CustomOnDemandResourcesRequestData* CustomOnDemandResourcesCreateRequest(const char* const* tags, int tagCount, CustomOnDemandResourcesRequestCompleteHandler handler) { NSMutableArray* tagArray = [NSMutableArray array]; for (int i = 0; i < tagCount; i++) { const char* tag = tags[i]; if (tag != NULL) { [tagArray addObject:[NSString stringWithUTF8String:tag]]; } } NSSet* tagSet = [NSSet setWithArray:tagArray]; CustomOnDemandResourcesRequestData* data = new CustomOnDemandResourcesRequestData(); data->request = [[NSBundleResourceRequest alloc] initWithTags:tagSet]; [data->request beginAccessingResourcesWithCompletionHandler:^(NSError* error) { dispatch_async(dispatch_get_main_queue(), ^{ const char* errorMessage = error ? [[error localizedDescription] UTF8String] : NULL; handler(data, errorMessage); }); }]; return data; } extern "C" void CustomOnDemandResourcesRelease(CustomOnDemandResourcesRequestData* data) { [data->request endAccessingResources]; delete data; } extern "C" float CustomOnDemandResourcesGetProgress(CustomOnDemandResourcesRequestData* data) { return data->request.progress.fractionCompleted; } extern "C" float CustomOnDemandResourcesGetLoadingPriority(CustomOnDemandResourcesRequestData* data) { float priority = (float)data->request.loadingPriority; return priority; } extern "C" void CustomOnDemandResourcesSetLoadingPriority(CustomOnDemandResourcesRequestData* data, float priority) { if (priority < 0.0f) priority = 0.0f; if (priority > 1.0f) data->request.loadingPriority = NSBundleResourceRequestLoadingPriorityUrgent; else data->request.loadingPriority = (double)priority; } extern "C" const char* CustomOnDemandResourcesGetResourcePath(CustomOnDemandResourcesRequestData * data, const char* resource) { NSString* resourceStr = [NSString stringWithUTF8String: resource]; NSString* path = [[data->request bundle] pathForResource: resourceStr ofType: nil]; if (path == nil) { return NULL; // или другое значение по умолчанию } const char* result = strdup([path UTF8String]); // копируем строку return result; // в C# нужно будет освободить память } extern "C" void CustomOnDemandResourcesFreeString(const char* str) { free((void*)str); } #else // ENABLE_IOS_ON_DEMAND_RESOURCES struct CustomOnDemandResourcesRequestData { }; extern "C" CustomOnDemandResourcesRequestData* CustomOnDemandResourcesCreateRequest(const char* const* tags, int tagCount, CustomOnDemandResourcesRequestCompleteHandler handler) { CustomOnDemandResourcesRequestData* data = new CustomOnDemandResourcesRequestData(); if (handler) handler(handlerData, NULL); return data; } extern "C" void CustomOnDemandResourcesRelease(CustomOnDemandResourcesRequestData* data) { delete data; } extern "C" float CustomOnDemandResourcesGetProgress(CustomOnDemandResourcesRequestData* data) { return 0.0f; } extern "C" float CustomOnDemandResourcesGetLoadingPriority(CustomOnDemandResourcesRequestData* data) { return 0.0f; } extern "C" void CustomOnDemandResourcesSetLoadingPriority(CustomOnDemandResourcesRequestData* data, float priority) { } extern "C" const char* CustomOnDemandResourcesGetResourcePath(CustomOnDemandResourcesRequestData * data, const char* resource) { return NULL; } extern "C" void CustomOnDemandResourcesFreeString(const char* str) { } #endif // ENABLE_IOS_ON_DEMAND_RESOURCES
0
0
141
Oct ’25
On demand module download
I am working on an iOS app and I want to achieve on demand module download inside the app when the user clicks on the module icon which he wants to use. The idea is that we have a super app consisting of multiple modules say four independent apps/features and I want to separate each one so that when the user selects a specific app/feature, it’s downloaded on demand and then opened directly within the same super app resulting in a lower app size initially I want to upload all the code of all modules to app store connect but when the user downloads the app, then only one module's code should be available to the user, the rest of the module's code should be downloaded when the user wants to use that module. I know apple restricts downloading new code but in my case I want to upload all the code to app store for review but just give option to the user to get rest of the code when needed. Any guidance, architectural advice, or example implementations would be highly appreciated.
1
0
181
Oct ’25
On-demand resource exporting?
I'm a newbie to on-demand resources and I feel like I'm missing something very obvious. I've successfully tagged and set up ODR in my Xcode project, but now I want to upload the assets to my own server so I can retrieve them from within the app, and I can't figure out how to export the files I need. I'm following the ODR Guide and I'm stuck at Step #4, after I've selected my archive in the Archives window it says to "Click the Export button", but this is what I see: As shown in the screenshot, there is no export button visible. I have tried different approaches, including distributing to appstore connect, and doing a local development release. The best I've been able to do is find a .assetpack folder inside the archive package through the finder, but uploading that, or the asset.car inside it, just gives me a "cannot parse response" error from the ODR loading code. I've verified I uploaded those to the correct URL. Can anyone walk me through how to save out the file(s) I need, in a form I can just upload to my server? Thanks, Pete
0
0
121
May ’25
Xcode editor fails to generate Swift Asset Symbol Extension if on demand resources is used
I started using on-demand resources for some data assets. After that, the Swift Asset Symbol Extension feature began to fail in the Xcode editor. Even though the app builds and runs fine, the Xcode editor shows errors, indicating that there is no extension variable for my color and image assets. I submitted feedback and updated it after each new Xcode release. However, I have not received any responses, and the problem persists. The Xcode versions I tested: 15.3, 15.4, 16.1, 16.2, 16.3 Steps to reproduce this error: Create a new app project (SwiftUI, Swift). Create a new color asset named "myBackground." In ContentView, add a background modifier to a view: .background(Color.myBackground). Auto-completion will work, and there are no issues. Create a new data asset named "myData." Add the "On Demand Resource" tag to "myData" with the tag "some_tag." Create a new color asset named "myOtherBackground" and make its color different from "myBackground." In ContentView, try to replace the background with Color.myOtherBackground. It will not be listed in auto-completion and will show the error "Type 'Color' has no member 'myOtherBackground.'" However, it will still compile and show "myOtherBackground" in the preview, simulator, or on the device. You will start to see the failed "Project Build Preparation" report in the Reports Navigator in Xcode. According to the report, the "GenerateAssetSymbols" command fails. Error message: GenerateAssetSymbols /Users/***/Projects/***/***/Assets.xcassets (in target '***' from project '***') cd /Users/***/Projects/*** /Applications/Xcode_15.3.app/Contents/Developer/usr/bin/actool --output-format human-readable-text --notices --warnings --export-dependency-info /Users/***/Library/Developer/Xcode/DerivedData/***-***/Index.noindex/Build/Intermediates.noindex/***.build/Debug-iphonesimulator/***.build/assetcatalog_dependencies --output-partial-info-plist /Users/***/Library/Developer/Xcode/DerivedData/***-***/Index.noindex/Build/Intermediates.noindex/***.build/Debug-iphonesimulator/***.build/assetcatalog_generated_info.plist --app-icon AppIcon --accent-color tint --compress-pngs --enable-on-demand-resources YES --development-region en --target-device iphone --minimum-deployment-target 15.0 --platform iphonesimulator --asset-pack-output-specifications /Users/***/Library/Developer/Xcode/DerivedData/***-***/Index.noindex/Build/Intermediates.noindex/***.build/Debug-iphonesimulator/***.build/AssetPackOutputSpecifications.plist --compile /Users/***/Library/Developer/Xcode/DerivedData/***-***/Index.noindex/Build/Products/Debug-iphonesimulator/workoutai.app /Users/***/Projects/***/***/Assets.xcassets --bundle-identifier *** --generate-swift-asset-symbols /Users/***/Library/Developer/Xcode/DerivedData/***-***/Index.noindex/Build/Intermediates.noindex/***.build/Debug-iphonesimulator/***.build/DerivedSources/GeneratedAssetSymbols.swift --generate-objc-asset-symbols /Users/***/Library/Developer/Xcode/DerivedData/***-***/Index.noindex/Build/Intermediates.noindex/***.build/Debug-iphonesimulator/***.build/DerivedSources/GeneratedAssetSymbols.h --generate-asset-symbol-index /Users/***/Library/Developer/Xcode/DerivedData/***-***/Index.noindex/Build/Intermediates.noindex/***.build/Debug-iphonesimulator/***.build/DerivedSources/GeneratedAssetSymbols-Index.plist /* com.apple.actool.errors */ : error: Could not create a NSArray from '/Users/***/Library/Developer/Xcode/DerivedData/***-***/Index.noindex/Build/Intermediates.noindex/***.build/Debug-iphonesimulator/***.build/AssetPackOutputSpecifications.plist'. : error: Not enough arguments provided; where is the input document to operate on? Command GenerateAssetSymbols failed with a nonzero exit code
1
0
529
Feb ’25
Code=4099 "Connection invalidated to streaming unzip service."
Hello, I am new to be using on-demand resources in my project, it’s a wonderful idea and concept I have to say! Kudos to whoever invented this! I am facing one problem that I couldn't solve so far: whenever I switch between the TestFlight / App Store / local Xcode builds I receive this error message: Code=4099 "Connection invalidated to streaming unzip service." Does anyone know what this means and how I can resolve it? I saw this other thread where it was recommended to delete & reinstall the app, but that is not always feasible because then all user data from the app is lost as well: https://forums.developer.apple.com/forums/thread/707070 Thanks a lot for any hints!
0
2
623
Dec ’24
On-demand resources suddenly stopped working?
So yesterday I noticed that some of images in my app stopped appearing. All of them were placed in the on-demand resources, that is I've assigned tags to them. Up until yesterday they were working correctly but since then whenever I try to load the assets I get the error message saying: Error Domain=NSCocoaErrorDomain Code=4099 "Connection invalidated to streaming unzip service." My code for loading the asset is pretty straightforward and it was working perfectly fine before: let resourceRequest = NSBundleResourceRequest(tags: ["vinyl"]) defer { resourceRequest.endAccessingResources() } do { if await !resourceRequest.conditionallyBeginAccessingResources() { try await resourceRequest.beginAccessingResources() } } catch { assertionFailure("Vinyl image was not available, error: \(error)") } I'm obviously using it in asynchronous context, but the old method which used completion handler gives me the same error. Has anyone encountered this issue as well? I just updated my devices to iOS 15.5, maybe that update broke on-demand resources? Tested on Xcode 13.4, iOS 15.5
6
6
3.7k
Dec ’24
On-demand resources asset packs invalidated on app update
Hello, I have an issue using on-demand resources. It happens that on every update the asset packs are always reported to be not present, even if the resources tagged on every asset pack do not change. This is very annoying since we rarely change the on demand resources on the asset packs, but our users still have to redownload them each time. I have inconsistent behavior debugging on Xcode directly on a device, so I am only able to consistently reproduce the issue uploading two builds on TestFlight. I have prepared a test project that I have tested on TestFlight and always reproduce the issue: https://drive.google.com/file/d/1oEH_ZBFjGIDTCrxe7Lu8XsFErFurg6HS/view?usp=sharing STEPS TO REPRODUCE Archive the "TestODR iOS" target Upload it on TestFlight Download it on a test iOS device and launch it Tap on "Download" button to get the on-demand resouces (it starts the download of two on-demand packs) Wait the download until you see "packAvailable = 1" on both packs Bump both the build and version numbers of the target Archive the "TestODR iOS" with the versions bumped Upload the new archive on TestFlight When it becoums available on TestFlight tap on "Update" button and launch it after the update When the app is launched you will see "packAvailable = 0" for both packs. Expected behaviour: After the update we expect to see packAvailable = 1 since no asset have changed between the two versions. Thanks, Francesco
3
0
779
Dec ’24
Clarification regarding App Bundle size limits
Hello, There is a table in the On Demand Resources Size Limits documentation that states the size of the thinned App Bundle should be: < 2GB for iOS < 18 < 4 GB for iOS 18+ However we have products on App Store that are already currently close to 4 GB without using ODR. The "Estimated file sizes for Build" in App Store Connect shows download sizes of about 3.5 GB. From the table it seems prior to iOS 18 you were allowed 2 GB + 2 GB initial install and prefetched if you are using ODR 2 GB if you are not using ODR However, since our available apps on the store are already close to 4GB pre iOS 18, we are a bit confused why our products worked and what are the limits. Can an app have 4GB large + 2GB ODR initial install/prefetch on iOS 17 ? Thanks, Dan
1
2
825
Oct ’24
[ODR] Install & Prefetched Tags not working
Hello there, I'm currently trying to use the ODR system, according to that guide: https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/index.html#//apple_ref/doc/uid/TP40015083-CH2-SW1. I followed the guide trough, however my install tags and prefetch tags, seems to not be installed when the app is installed as describe by the documentation. I did add them to the list of install and prefetched tags in the project, nothing seems to be working so far. I tried installing the app directly from Testflight but got to the same result. The request system for the ODR tags work as expected, so far the only way to make my install nor prefetch tags works was to actually call the "beginAccessingResourcesWithCompletionHandler" directly with the wanted tags, I also try to use the "conditionnallyBeginAccessingResourcesWithCompletionHandler" which give me resourcesAvailable is false for the install & prefetch tags. Any help will be more than welcome. Thanks, Jérémy
2
0
1.2k
Aug ’24
Prefetched tags (On demand resources)
Hello. I'm trying to make the ODR experience as seamless as possible while reducing the app bundle size same time. According to the documentation, the files associated with the tags placed in the prefetch tag order section should start downloading immediately after installing the app, but my observations show that the resources behave like it's associated with on demand tag. Assuming: I expected that at least few first resources in order will be ready after 10-15 sec after installing and accessing these resources through conditionallyBeginAccessingResource() will return success almost immediately, but it's not. Anyone faced this behaviour? Does this technology is still actual for 2022?
1
0
1.2k
Aug ’24
On Demand Resources Not Working in Release Build for Real Device
I have implemented On Demand Resources (ODR) in my iOS app using Swift. The ODR feature works correctly when running the app directly from Xcode 15.3. However, when I archive the app and install the release build on a real device, the ODR feature fails to function as expected. I followed up this doc. https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/index.html#//apple_ref/doc/uid/TP40015083-CH2-SW1 I have read that adding specific entitlements for ODR might be necessary, but I'm unsure how to properly configure this.
1
0
855
Jul ’24
how to include secrets file
Hi. My app hits an API. I have the API key stored in a config.plist file. Of course, I don't want to include this file in version control. So I omitted it. I have a workflow that when I push to my main branch, it pushes the newest version to internal testers on test flight. The problem is, the deployed code cannot find the config file, which makes sense. My approach to this problem has been to use resource tags Targets > Resource Tags And I declared that this app should download this resource. I can't figure out how to categorize it as other than download on demand . I would like it to be downloaded immediately with the app. Am I even on the right track here?
1
0
1.1k
Jun ’24
ODR Legacy Technology Issues
Hello, We are currently evaluating ways to reduce the app size of the my App. The app contains approximately 200~250 MB of bundled static resources, and we are considering converting these resources into On-Demand Resources(ODR) in order to reduce the initial download and installation size of the app. However, we noticed that ODR is currently marked by Apple as a Legacy Technology. Since we would like these resources to continue being hosted and distributed through Apple CDN / App Store infrastructure, the first alternative we considered is Managed Background Assets, rather than regular Background Assets. We understand that regular Background Assets are available on iOS 16 and later, but they mainly address background download scheduling for apps. What we are specifically looking for is the resource hosting and distribution capability, similar to ODR, where assets can be hosted and delivered through Apple’s infrastructure. This is why we are considering Managed Background Assets. However, my App currently supports devices starting from iOS 14, while the key capabilities of Managed Background Assets require newer iOS versions. As a result, this solution cannot fully cover users who are still on older iOS versions, such as iOS 14 through iOS 18. Given this background, we would like to ask Apple the following questions: Does Apple have any plan to discontinue ODR-related services in the future, especially the App Store-hosted ODR asset download service? If the ODR service is changed or discontinued in the future, would it affect already released App Store apps that rely on ODR asset downloads on older iOS versions? For apps that still need to support iOS 14 and later, while also relying on Apple CDN / App Store infrastructure for resource hosting and distribution, does Apple still recommend using ODR? For apps that cannot immediately raise their minimum supported iOS version to the version required by Managed Background Assets, is there a recommended transition strategy? If ODR services are discontinued in the future, will Apple provide an alternative resource distribution solution that supports older iOS versions, or would developers need to build and maintain their own resource hosting and download system? We would like to better understand the long-term availability and potential risks of using ODR on older iOS versions, so that we can make an appropriate decision for future app size reduction and asset delivery in the App. Thank you.
Replies
0
Boosts
0
Views
82
Activity
2w
On-Demand Resources with Initial Install Tags Are Frequently Unavailable at First Launch
Hello, Because our app package size is relatively large, part of our resources needs to be delivered through Apple-hosted asset packs. If we use the Background Assets framework to download these Apple-hosted packs, our app would only be able to support devices running iOS 26 or later. To maintain compatibility with a broader range of iOS versions, we chose to use iOS On-Demand Resources instead. However, during actual use, we found that even when these packs are marked with the initial install tag, there is still a fairly high probability (around 40%) that they are not available on the first screen after the app is launched for the first time. When we try to access them through conditionallyBeginAccessingResourcesWithCompletionHandler, the resources are unavailable, which forces us to download them again. During testing, we added event tracking and found that out of 22 users who downloaded the app, 9 had to re-download these resource packs on first launch. Each of these packs marked with the initial install tag is about 300 MB in size. We have also made sure to follow the NSBundleResourceRequest limitation that no more than 2000 × 1000 × 1000 bytes of resources should be accessed at the same time. We would like to understand why these packs, even though they are marked as initial install, still have such a high probability (around 40%) of being unavailable on the first screen at first launch.
Replies
3
Boosts
0
Views
276
Activity
Apr ’26
Read, Write, and Consuming Files / URLs
Hello, I have an asset pack that I'm use to periodically distribute a sqlite database thats being used to an NSPersistentStore. Because the database is over a few GBs, and the files in an AssetPack are not mutable, I have to stream the database into a temporary file, then replace my NSPersistentStore. This requires that the user has 3x the storage available of the database, and permanently uses twice to storage needed. I'd like: To be able to mark a URL/File to be accessible for read/write access To be able to mark a file / URL as consumed when it's no needed. So that it can be cleared from the user storage while still maintaining an active subscription to the asset pack for updates. Thank you
Replies
4
Boosts
0
Views
504
Activity
Feb ’26
ITMS-90555: On-Demand Resources exceed 30GB after App Thinning – Need clarification on variant size calculation
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!
Replies
2
Boosts
0
Views
373
Activity
Jan ’26
On Demand Resources as Legacy Technology
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.
Replies
1
Boosts
0
Views
479
Activity
Nov ’25
On Demand Resources - App Review
After uploading the build to Test Flight, we are successfully able to download the ODR tags. Submitting that same build for an App Review, they are having issues. After further investigation, they are not able to resolve the hostname when trying to download the tag. This failure on the app is causing our app to be rejected. It would be great to get some guidance on how best to resolve this situation for the App Review team. Thanks!
Replies
1
Boosts
0
Views
175
Activity
Nov ’25
On Demand Resources does not show an error
I am integrating On Demand Resources into my Unity game. The resources install without any problems if the internet connection is stable: all resources are installed. While testing various scenarios without an internet connection, I encountered the following problem: if I turn off the internet during installation, I don't get any error messages, but if I turn the internet back on, the download no longer continues (and I still don't get an error). If I reopen the application with a stable internet connection, the download will always be at 0%. Please tell me what I am doing wrong. #import "Foundation/Foundation.h" #if ENABLE_IOS_ON_DEMAND_RESOURCES #import "Foundation/NSBundle.h" #endif #include <string.h> struct CustomOnDemandResourcesRequestData; typedef void (*CustomOnDemandResourcesRequestCompleteHandler)(struct CustomOnDemandResourcesRequestData* handler, const char* error); #if ENABLE_IOS_ON_DEMAND_RESOURCES struct CustomOnDemandResourcesRequestData { NSBundleResourceRequest* request; }; extern "C" CustomOnDemandResourcesRequestData* CustomOnDemandResourcesCreateRequest(const char* const* tags, int tagCount, CustomOnDemandResourcesRequestCompleteHandler handler) { NSMutableArray* tagArray = [NSMutableArray array]; for (int i = 0; i < tagCount; i++) { const char* tag = tags[i]; if (tag != NULL) { [tagArray addObject:[NSString stringWithUTF8String:tag]]; } } NSSet* tagSet = [NSSet setWithArray:tagArray]; CustomOnDemandResourcesRequestData* data = new CustomOnDemandResourcesRequestData(); data->request = [[NSBundleResourceRequest alloc] initWithTags:tagSet]; [data->request beginAccessingResourcesWithCompletionHandler:^(NSError* error) { dispatch_async(dispatch_get_main_queue(), ^{ const char* errorMessage = error ? [[error localizedDescription] UTF8String] : NULL; handler(data, errorMessage); }); }]; return data; } extern "C" void CustomOnDemandResourcesRelease(CustomOnDemandResourcesRequestData* data) { [data->request endAccessingResources]; delete data; } extern "C" float CustomOnDemandResourcesGetProgress(CustomOnDemandResourcesRequestData* data) { return data->request.progress.fractionCompleted; } extern "C" float CustomOnDemandResourcesGetLoadingPriority(CustomOnDemandResourcesRequestData* data) { float priority = (float)data->request.loadingPriority; return priority; } extern "C" void CustomOnDemandResourcesSetLoadingPriority(CustomOnDemandResourcesRequestData* data, float priority) { if (priority < 0.0f) priority = 0.0f; if (priority > 1.0f) data->request.loadingPriority = NSBundleResourceRequestLoadingPriorityUrgent; else data->request.loadingPriority = (double)priority; } extern "C" const char* CustomOnDemandResourcesGetResourcePath(CustomOnDemandResourcesRequestData * data, const char* resource) { NSString* resourceStr = [NSString stringWithUTF8String: resource]; NSString* path = [[data->request bundle] pathForResource: resourceStr ofType: nil]; if (path == nil) { return NULL; // или другое значение по умолчанию } const char* result = strdup([path UTF8String]); // копируем строку return result; // в C# нужно будет освободить память } extern "C" void CustomOnDemandResourcesFreeString(const char* str) { free((void*)str); } #else // ENABLE_IOS_ON_DEMAND_RESOURCES struct CustomOnDemandResourcesRequestData { }; extern "C" CustomOnDemandResourcesRequestData* CustomOnDemandResourcesCreateRequest(const char* const* tags, int tagCount, CustomOnDemandResourcesRequestCompleteHandler handler) { CustomOnDemandResourcesRequestData* data = new CustomOnDemandResourcesRequestData(); if (handler) handler(handlerData, NULL); return data; } extern "C" void CustomOnDemandResourcesRelease(CustomOnDemandResourcesRequestData* data) { delete data; } extern "C" float CustomOnDemandResourcesGetProgress(CustomOnDemandResourcesRequestData* data) { return 0.0f; } extern "C" float CustomOnDemandResourcesGetLoadingPriority(CustomOnDemandResourcesRequestData* data) { return 0.0f; } extern "C" void CustomOnDemandResourcesSetLoadingPriority(CustomOnDemandResourcesRequestData* data, float priority) { } extern "C" const char* CustomOnDemandResourcesGetResourcePath(CustomOnDemandResourcesRequestData * data, const char* resource) { return NULL; } extern "C" void CustomOnDemandResourcesFreeString(const char* str) { } #endif // ENABLE_IOS_ON_DEMAND_RESOURCES
Replies
0
Boosts
0
Views
141
Activity
Oct ’25
On demand module download
I am working on an iOS app and I want to achieve on demand module download inside the app when the user clicks on the module icon which he wants to use. The idea is that we have a super app consisting of multiple modules say four independent apps/features and I want to separate each one so that when the user selects a specific app/feature, it’s downloaded on demand and then opened directly within the same super app resulting in a lower app size initially I want to upload all the code of all modules to app store connect but when the user downloads the app, then only one module's code should be available to the user, the rest of the module's code should be downloaded when the user wants to use that module. I know apple restricts downloading new code but in my case I want to upload all the code to app store for review but just give option to the user to get rest of the code when needed. Any guidance, architectural advice, or example implementations would be highly appreciated.
Replies
1
Boosts
0
Views
181
Activity
Oct ’25
On-demand resource exporting?
I'm a newbie to on-demand resources and I feel like I'm missing something very obvious. I've successfully tagged and set up ODR in my Xcode project, but now I want to upload the assets to my own server so I can retrieve them from within the app, and I can't figure out how to export the files I need. I'm following the ODR Guide and I'm stuck at Step #4, after I've selected my archive in the Archives window it says to "Click the Export button", but this is what I see: As shown in the screenshot, there is no export button visible. I have tried different approaches, including distributing to appstore connect, and doing a local development release. The best I've been able to do is find a .assetpack folder inside the archive package through the finder, but uploading that, or the asset.car inside it, just gives me a "cannot parse response" error from the ODR loading code. I've verified I uploaded those to the correct URL. Can anyone walk me through how to save out the file(s) I need, in a form I can just upload to my server? Thanks, Pete
Replies
0
Boosts
0
Views
121
Activity
May ’25
Xcode editor fails to generate Swift Asset Symbol Extension if on demand resources is used
I started using on-demand resources for some data assets. After that, the Swift Asset Symbol Extension feature began to fail in the Xcode editor. Even though the app builds and runs fine, the Xcode editor shows errors, indicating that there is no extension variable for my color and image assets. I submitted feedback and updated it after each new Xcode release. However, I have not received any responses, and the problem persists. The Xcode versions I tested: 15.3, 15.4, 16.1, 16.2, 16.3 Steps to reproduce this error: Create a new app project (SwiftUI, Swift). Create a new color asset named "myBackground." In ContentView, add a background modifier to a view: .background(Color.myBackground). Auto-completion will work, and there are no issues. Create a new data asset named "myData." Add the "On Demand Resource" tag to "myData" with the tag "some_tag." Create a new color asset named "myOtherBackground" and make its color different from "myBackground." In ContentView, try to replace the background with Color.myOtherBackground. It will not be listed in auto-completion and will show the error "Type 'Color' has no member 'myOtherBackground.'" However, it will still compile and show "myOtherBackground" in the preview, simulator, or on the device. You will start to see the failed "Project Build Preparation" report in the Reports Navigator in Xcode. According to the report, the "GenerateAssetSymbols" command fails. Error message: GenerateAssetSymbols /Users/***/Projects/***/***/Assets.xcassets (in target '***' from project '***') cd /Users/***/Projects/*** /Applications/Xcode_15.3.app/Contents/Developer/usr/bin/actool --output-format human-readable-text --notices --warnings --export-dependency-info /Users/***/Library/Developer/Xcode/DerivedData/***-***/Index.noindex/Build/Intermediates.noindex/***.build/Debug-iphonesimulator/***.build/assetcatalog_dependencies --output-partial-info-plist /Users/***/Library/Developer/Xcode/DerivedData/***-***/Index.noindex/Build/Intermediates.noindex/***.build/Debug-iphonesimulator/***.build/assetcatalog_generated_info.plist --app-icon AppIcon --accent-color tint --compress-pngs --enable-on-demand-resources YES --development-region en --target-device iphone --minimum-deployment-target 15.0 --platform iphonesimulator --asset-pack-output-specifications /Users/***/Library/Developer/Xcode/DerivedData/***-***/Index.noindex/Build/Intermediates.noindex/***.build/Debug-iphonesimulator/***.build/AssetPackOutputSpecifications.plist --compile /Users/***/Library/Developer/Xcode/DerivedData/***-***/Index.noindex/Build/Products/Debug-iphonesimulator/workoutai.app /Users/***/Projects/***/***/Assets.xcassets --bundle-identifier *** --generate-swift-asset-symbols /Users/***/Library/Developer/Xcode/DerivedData/***-***/Index.noindex/Build/Intermediates.noindex/***.build/Debug-iphonesimulator/***.build/DerivedSources/GeneratedAssetSymbols.swift --generate-objc-asset-symbols /Users/***/Library/Developer/Xcode/DerivedData/***-***/Index.noindex/Build/Intermediates.noindex/***.build/Debug-iphonesimulator/***.build/DerivedSources/GeneratedAssetSymbols.h --generate-asset-symbol-index /Users/***/Library/Developer/Xcode/DerivedData/***-***/Index.noindex/Build/Intermediates.noindex/***.build/Debug-iphonesimulator/***.build/DerivedSources/GeneratedAssetSymbols-Index.plist /* com.apple.actool.errors */ : error: Could not create a NSArray from '/Users/***/Library/Developer/Xcode/DerivedData/***-***/Index.noindex/Build/Intermediates.noindex/***.build/Debug-iphonesimulator/***.build/AssetPackOutputSpecifications.plist'. : error: Not enough arguments provided; where is the input document to operate on? Command GenerateAssetSymbols failed with a nonzero exit code
Replies
1
Boosts
0
Views
529
Activity
Feb ’25
Code=4099 "Connection invalidated to streaming unzip service."
Hello, I am new to be using on-demand resources in my project, it’s a wonderful idea and concept I have to say! Kudos to whoever invented this! I am facing one problem that I couldn't solve so far: whenever I switch between the TestFlight / App Store / local Xcode builds I receive this error message: Code=4099 "Connection invalidated to streaming unzip service." Does anyone know what this means and how I can resolve it? I saw this other thread where it was recommended to delete & reinstall the app, but that is not always feasible because then all user data from the app is lost as well: https://forums.developer.apple.com/forums/thread/707070 Thanks a lot for any hints!
Replies
0
Boosts
2
Views
623
Activity
Dec ’24
On-demand resources suddenly stopped working?
So yesterday I noticed that some of images in my app stopped appearing. All of them were placed in the on-demand resources, that is I've assigned tags to them. Up until yesterday they were working correctly but since then whenever I try to load the assets I get the error message saying: Error Domain=NSCocoaErrorDomain Code=4099 "Connection invalidated to streaming unzip service." My code for loading the asset is pretty straightforward and it was working perfectly fine before: let resourceRequest = NSBundleResourceRequest(tags: ["vinyl"]) defer { resourceRequest.endAccessingResources() } do { if await !resourceRequest.conditionallyBeginAccessingResources() { try await resourceRequest.beginAccessingResources() } } catch { assertionFailure("Vinyl image was not available, error: \(error)") } I'm obviously using it in asynchronous context, but the old method which used completion handler gives me the same error. Has anyone encountered this issue as well? I just updated my devices to iOS 15.5, maybe that update broke on-demand resources? Tested on Xcode 13.4, iOS 15.5
Replies
6
Boosts
6
Views
3.7k
Activity
Dec ’24
On-demand resources asset packs invalidated on app update
Hello, I have an issue using on-demand resources. It happens that on every update the asset packs are always reported to be not present, even if the resources tagged on every asset pack do not change. This is very annoying since we rarely change the on demand resources on the asset packs, but our users still have to redownload them each time. I have inconsistent behavior debugging on Xcode directly on a device, so I am only able to consistently reproduce the issue uploading two builds on TestFlight. I have prepared a test project that I have tested on TestFlight and always reproduce the issue: https://drive.google.com/file/d/1oEH_ZBFjGIDTCrxe7Lu8XsFErFurg6HS/view?usp=sharing STEPS TO REPRODUCE Archive the "TestODR iOS" target Upload it on TestFlight Download it on a test iOS device and launch it Tap on "Download" button to get the on-demand resouces (it starts the download of two on-demand packs) Wait the download until you see "packAvailable = 1" on both packs Bump both the build and version numbers of the target Archive the "TestODR iOS" with the versions bumped Upload the new archive on TestFlight When it becoums available on TestFlight tap on "Update" button and launch it after the update When the app is launched you will see "packAvailable = 0" for both packs. Expected behaviour: After the update we expect to see packAvailable = 1 since no asset have changed between the two versions. Thanks, Francesco
Replies
3
Boosts
0
Views
779
Activity
Dec ’24
Clarification regarding App Bundle size limits
Hello, There is a table in the On Demand Resources Size Limits documentation that states the size of the thinned App Bundle should be: < 2GB for iOS < 18 < 4 GB for iOS 18+ However we have products on App Store that are already currently close to 4 GB without using ODR. The "Estimated file sizes for Build" in App Store Connect shows download sizes of about 3.5 GB. From the table it seems prior to iOS 18 you were allowed 2 GB + 2 GB initial install and prefetched if you are using ODR 2 GB if you are not using ODR However, since our available apps on the store are already close to 4GB pre iOS 18, we are a bit confused why our products worked and what are the limits. Can an app have 4GB large + 2GB ODR initial install/prefetch on iOS 17 ? Thanks, Dan
Replies
1
Boosts
2
Views
825
Activity
Oct ’24
[ODR] Install & Prefetched Tags not working
Hello there, I'm currently trying to use the ODR system, according to that guide: https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/index.html#//apple_ref/doc/uid/TP40015083-CH2-SW1. I followed the guide trough, however my install tags and prefetch tags, seems to not be installed when the app is installed as describe by the documentation. I did add them to the list of install and prefetched tags in the project, nothing seems to be working so far. I tried installing the app directly from Testflight but got to the same result. The request system for the ODR tags work as expected, so far the only way to make my install nor prefetch tags works was to actually call the "beginAccessingResourcesWithCompletionHandler" directly with the wanted tags, I also try to use the "conditionnallyBeginAccessingResourcesWithCompletionHandler" which give me resourcesAvailable is false for the install & prefetch tags. Any help will be more than welcome. Thanks, Jérémy
Replies
2
Boosts
0
Views
1.2k
Activity
Aug ’24
Prefetched tags (On demand resources)
Hello. I'm trying to make the ODR experience as seamless as possible while reducing the app bundle size same time. According to the documentation, the files associated with the tags placed in the prefetch tag order section should start downloading immediately after installing the app, but my observations show that the resources behave like it's associated with on demand tag. Assuming: I expected that at least few first resources in order will be ready after 10-15 sec after installing and accessing these resources through conditionallyBeginAccessingResource() will return success almost immediately, but it's not. Anyone faced this behaviour? Does this technology is still actual for 2022?
Replies
1
Boosts
0
Views
1.2k
Activity
Aug ’24
On Demand Resources Not Working in Release Build for Real Device
I have implemented On Demand Resources (ODR) in my iOS app using Swift. The ODR feature works correctly when running the app directly from Xcode 15.3. However, when I archive the app and install the release build on a real device, the ODR feature fails to function as expected. I followed up this doc. https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/index.html#//apple_ref/doc/uid/TP40015083-CH2-SW1 I have read that adding specific entitlements for ODR might be necessary, but I'm unsure how to properly configure this.
Replies
1
Boosts
0
Views
855
Activity
Jul ’24
how to include secrets file
Hi. My app hits an API. I have the API key stored in a config.plist file. Of course, I don't want to include this file in version control. So I omitted it. I have a workflow that when I push to my main branch, it pushes the newest version to internal testers on test flight. The problem is, the deployed code cannot find the config file, which makes sense. My approach to this problem has been to use resource tags Targets > Resource Tags And I declared that this app should download this resource. I can't figure out how to categorize it as other than download on demand . I would like it to be downloaded immediately with the app. Am I even on the right track here?
Replies
1
Boosts
0
Views
1.1k
Activity
Jun ’24
On-Demand Resources vs CDN
Hi, I want to create an offline mode for my iOS app. Where is it better to keep files in terms of download speed: in a CDN like Cloudflare or using On-Demand Resources? The total file size is 2 GB.
Replies
0
Boosts
0
Views
692
Activity
May ’24
HTML5 Games to "embedded in the binary "
As per the new App Review Guidelines, are HTML5 games provided within apps required to embed in the binary? Given that the App Review Guidelines' section 4.7 has been updated.
Replies
0
Boosts
0
Views
807
Activity
Mar ’24