The app weighs 180 MB when downloaded on an iPhone 13 mini, yet the same size on an iPad Pro, even though the tablet doesn't need @2x assets. This scenario is typical for projects where resources are gathered into one universal bundle without considering resolutions and architectures. As a result, users with smaller devices waste traffic on unnecessary data, and installation slows down.
App Thinning solves this problem: the App Store automatically assembles a variant tailored to the specific device, delivering only the necessary resources. We configure the full App Thinning cycle — Slicing, Bitcode, and On-Demand Resources — to achieve the smallest possible download package. The combined savings can be up to 50%, which for 100,000 installations saves about $5,000 in mobile traffic. The app delivery cost decreases by roughly $0.02 per download.
Apple Developer Documentation recommends using Asset Catalog for all resources so that Slicing works correctly.
How App Thinning Reduces IPA Size
| Device | Size without Thinning | Size with Thinning | Savings |
|---|---|---|---|
| iPhone SE (gen2) | 180 MB | 110 MB | ~39% |
| iPhone 14 Pro | 180 MB | 130 MB | ~28% |
| iPad Pro 12.9" | 180 MB | 95 MB | ~47% |
Data for an app with @2x and @3x layouts, ODR tags, and Bitcode removal.
Slicing
The App Store creates separate IPAs for each device. iPhone 8 gets only @2x resources and an ARMv8 slice, iPad Pro gets @3x and ARM64e. The key requirement: Asset Catalog. Resources outside .xcassets are not sliced — they end up in all variants. We ensure all images are in the catalog with correct size slots (@1x/@2x/@3x) and trait variations (iPhone/iPad/Mac).
We verify the result via Xcode → Product → Archive → Distribute → Ad Hoc/Development → Export → App Thinning: All compatible device variants. After export, we examine App Thinning Size Report.txt — the table shows sizes for each device.
On-Demand Resources (ODR)
Content that isn't needed immediately (game levels, tutorials, filters) is tagged and loaded on request. It is stored on Apple's servers, not increasing the IPA.
Configuration:
- In Xcode: Target → Build Phases → Copy Bundle Resources → set On Demand Resource Tags for the resource in Asset Catalog.
- In code, use NSBundleResourceRequest:
let request = NSBundleResourceRequest(tags: ["level_5"]) request.conditionallyBeginAccessingResources { available in if available { // resource already loaded } else { request.beginAccessingResources { error in guard error == nil else { return } // resource loaded, can use } } } ODR limits:
| Parameter | Limit |
|---|---|
| Initial install bundle | up to 200 MB |
| On-demand resources | up to 20 GB |
| Simultaneously loaded ODR | up to 2 GB |
For games with large content, ODR fundamentally changes the installer size — we guarantee optimization without losing user experience.
Bitcode
Bitcode is an intermediate LLVM representation that Apple can recompile for new architectures. In modern Xcode versions, Bitcode is not required for iOS apps — the requirement has been removed. For watchOS and tvOS, Bitcode may still be needed if using an older Xcode or libraries. If you support old libraries that require Bitcode, we set ENABLE_BITCODE = YES in Build Settings. All frameworks must contain Bitcode, otherwise the whole build loses this capability.
Bitcode became optional for iOS with an Xcode update. However, for watchOS and tvOS it may still be required with older Xcode or libraries. If you support old libraries, check compatibility.
Why ODR Matters for Games and Large Apps
ODR allows deferring the loading of content that is not needed at startup. Without ODR, the user downloads everything at once, increasing time to first launch and reducing conversion. With ODR configured, the app loads faster, and content is fetched as needed. Comparison: without ODR, a game can weigh 2 GB at install; with ODR, only 200 MB plus level loading.
Common App Thinning Configuration Mistakes
- Resources added via
File → Add Filesinstead of Asset Catalog → no slicing. - ODR tags assigned but
NSBundleResourceRequestdoes not callendAccessingResources()→ resource never released. - ODR testing not performed in offline mode → on real users, the download does not handle network errors.
How We Do It: Work Process
- Analytics: audit current Asset Catalog, identify resources outside catalog, estimate ODR content volume.
- Design: distribute resources into @1x/@2x/@3x slots, assign ODR tags, decide on Bitcode.
- Implementation: migrate to Asset Catalog, implement
NSBundleResourceRequestin code, enable Bitcode if needed. - Testing: build with App Thinning on All compatible device variants, check Size Report, test ODR in offline mode.
- Deployment: upload to App Store Connect, verify sizes in TestFlight.
What's Included
- Audit of current resources and Asset Catalog
- Migration of images into
.xcassets(if required) - Slicing configuration and Size Report verification
- On-Demand Resources setup with tags and code
- Testing on real devices under various network conditions
- Documentation of settings and recommendations
Timeline and Cost
Configuring App Thinning for an existing project takes 1 to 3 days. If resource migration from folders to Asset Catalog is needed, add 2–5 days depending on volume. Pricing is calculated individually. Our 7+ years of iOS development experience guarantees IPA size reduction of 30–50% without loss of functionality. To assess the potential of App Thinning for your project, get in touch with us. We'll conduct an audit and propose the optimal configuration. Order the setup and receive an optimized app.







