Do You Track the Weight of Your App?
Why is a banking app sometimes larger than a game?
I’ve often noticed something that doesn’t quite add up.
A banking app.
A food delivery app.
Sometimes larger than a fully featured mobile game — with graphics, animations, sound, and real-time logic.
And yet the banking app weighs more.
Every time I see:
Update size: 180 MB
for an app that mostly renders forms and network responses, I pause.
What exactly am I downloading?
Inside development teams, internet feels unlimited.
Fast Wi-Fi. Stable connections. No friction.
But outside that bubble, reality is different.
Roaming costs money.
International eSIM plans aren’t cheap.
Mobile data in many countries is limited.
After paying for traffic you didn’t expect to consume, the question becomes practical — not theoretical.
Storage is another constraint.
128 GB devices are still common.
A few heavy everyday apps — banking, delivery, shopping, social — and space disappears quickly.
When that happens, users don’t complain.
They postpone.
“I’ll download it later.”
And later often means never.
As users, we can’t control this.
As engineers, we can.
App size is not accidental.
It is the result of decisions.
And that is where this discussion begins.
1. What “App Size” Actually Means
When we talk about “app size,” we often refer to different numbers without realizing it.
There is no single app size — there are multiple metrics produced at different stages of build and distribution.
Understanding which one you are measuring is the first step toward meaningful optimization.
• Download Size
Download size is the compressed package transferred over the network when a user installs or updates the app.
Through App Thinning and slicing, users receive a device-specific variant of the app — only the architectures and resources required for their device.
Because the package is compressed and tailored to a specific device, download size is typically smaller than the installed size.
• Installed Size
Installed size is the space the app occupies on the device after installation.
It represents the unpacked app bundle written to disk and includes:
- the executable
- bundled resources
- embedded frameworks
- assets
This is the number that affects storage constraints — especially on 64 GB and 128 GB devices.
• Build artifacts (.app, .ipa, .xcarchive)
During development, Xcode generates:
- a compiled .app bundle
- an .xcarchive
- optionally, an exported .ipa
These are local build artifacts used for debugging, signing, and upload.
They are convenient to measure — but they are not identical to what users ultimately receive from the App Store.
• From Local Build to App Store Delivery
After upload, the App Store processes the build before distribution.
Device-specific variants are generated, and users receive a compressed package tailored to their device.
They do not download your original exported .ipa.
After installation, that package is unpacked and written to storage as the app bundle.
• Why This Matters
App size is the result of multiple stages:
Build
→ App Store processing
→ Device-specific delivery
→ Download (compressed)
→ Installation (unpacked)
If you measure only local build artifacts, you risk optimizing the wrong metric.
Without understanding which stage you are measuring, optimization becomes guesswork.
2. Measuring App Size Correctly
Talking about app size without measuring it properly leads to wrong conclusions.
There isn’t a single “app size.”
There are multiple metrics — and they describe different stages of distribution.
• Local Build Artifacts
You can check:
- .app
- .ipa
- .xcarchive
These are developer-facing build outputs.
They are useful for debugging and packaging, but they do not represent what users actually download from the App Store.
Optimizing only these numbers can be misleading.
• Xcode App Thinning Size Report
During development, you can generate an App Thinning Size Report in Xcode by exporting an archive with thinning enabled.
Xcode produces a device-variant breakdown in plain text format, showing how the app would be packaged for different configurations.
It provides:
- estimated device-specific download size
- estimated install size
This simulates how slicing affects different device variants before distribution.
When analyzing AirHorizon, this report was the first place where I could clearly observe how different device variants affect both download size and installed footprint — even before uploading the build to App Store Connect.
• Example (device-specific export):
App Thinning configuration:
- Device variant: iPhone 17 Pro
- Thinning mode: device-specific
The excerpt below is part of the App Thinning Size Report generated during archive export in Xcode:
Supported variant descriptors: [device: iPhone11,4, os-version: 17.4], [device: iPhone11,4, os-version: 17.0], [device: iPhone16,1, os-version: 17.4], [device: iPhone16,2, os-version: 26.0], [device: iPhone11,2, os-version: 16.0], [device: iPhone11,2, os-version: 17.0], [device: iPhone16,2, os-version: 17.4], [device: iPhone11,6, os-version: 15.0], [device: iPhone13,1, os-version: 15.0], [device: iPhone9,4, os-version: 15.0], [device: iPhone14,2, os-version: 26.0], [device: iPhone10,6, os-version: 16.0], [device: iPhone12,3, os-version: 17.0], [device: iPhone11,6, os-version: 17.0], [device: iPhone16,1, os-version: 17.0], [device: iPhone13,4, os-version: 26.0], [device: iPhone12,5, os-version: 26.0], [device: iPhone11,4, os-version: 18.0], [device: iPhone13,2, os-version: 18.0], [device: iPhone14,3, os-version: 18.0], [device: iPhone9,2, os-version: 15.0], [device: iPhone13,2, os-version: 26.0], [device: iPhone14,5, os-version: 17.0], [device: iPhone15,4, os-version: 17.0], [device: iPhone14,8, os-version: 17.4], [device: iPhone10,3, os-version: 16.0], [device: iPhone14,2, os-version: 16.0], [device: iPhone12,5, os-version: 18.0], [device: iPhone14,2, os-version: 17.4], [device: iPhone14,8, os-version: 17.0], [device: iPhone14,5, os-version: 16.0], [device: iPhone12,3, os-version: 26.0], [device: iPhone12,5, os-version: 17.0], [device: iPhone10,6, os-version: 15.0], [device: iPhone14,2, os-version: 18.0], [device: iPhone18,4, os-version: 26.0], [device: iPhone10,3, os-version: 15.0], [device: iPhone12,3, os-version: 17.4], [device: iPhone17,2, os-version: 26.0], [device: iPhone14,7, os-version: 26.0], [device: iPhone14,3, os-version: 17.4], [device: iPhone11,2, os-version: 18.0], [device: iPhone17,4, os-version: 26.0], [device: iPhone14,4, os-version: 18.0], [device: iPhone8,2, os-version: 15.0], [device: iPhone13,1, os-version: 26.0], [device: iPhone13,3, os-version: 18.0], [device: iPhone17,5, os-version: 18.0], [device: iPhone14,4, os-version: 16.0], [device: iPhone17,2, os-version: 18.0], [device: iPhone18,2, os-version: 26.0], [device: iPhone18,3, os-version: 26.0], [device: iPhone13,1, os-version: 17.0], [device: iPhone14,7, os-version: 16.0], [device: iPhone15,3, os-version: 17.4], [device: iPhone14,8, os-version: 26.0], [device: iPhone14,4, os-version: 15.0], [device: iPhone14,3, os-version: 16.0], [device: iPhone13,1, os-version: 18.0], [device: iPhone13,3, os-version: 26.0], [device: iPhone13,2, os-version: 16.0], [device: iPhone13,3, os-version: 16.0], [device: iPhone13,2, os-version: 17.0], [device: iPhone14,5, os-version: 17.4], [device: iPhone14,2, os-version: 17.0], [device: iPhone10,5, os-version: 15.0], [device: iPhone14,3, os-version: 17.0], [device: iPhone15,3, os-version: 17.0], [device: iPhone14,5, os-version: 26.0], [device: iPhone12,5, os-version: 16.0], [device: iPhone15,3, os-version: 26.0], [device: iPhone14,5, os-version: 15.0], [device: iPhone10,2, os-version: 16.0], [device: iPhone16,2, os-version: 17.0], [device: iPhone17,1, os-version: 18.0], [device: iPhone11,2, os-version: 15.0], [device: iPhone12,3, os-version: 15.0], [device: iPhone13,2, os-version: 15.0], [device: iPhone14,4, os-version: 26.0], [device: iPhone13,4, os-version: 17.0], [device: iPhone14,3, os-version: 26.0], [device: iPhone10,5, os-version: 16.0], [device: iPhone14,7, os-version: 17.0], [device: iPhone11,6, os-version: 18.0], [device: iPhone15,5, os-version: 17.0], [device: iPhone15,3, os-version: 16.0], [device: iPhone15,5, os-version: 17.4], [device: iPhone14,3, os-version: 15.0], [device: iPhone10,2, os-version: 15.0], [device: iPhone15,4, os-version: 18.0], [device: iPhone13,4, os-version: 18.0], [device: iPhone15,3, os-version: 18.0], [device: iPhone17,1, os-version: 26.0], [device: iPhone14,7, os-version: 18.0], [device: iPhone18,1, os-version: 26.0], [device: iPhone11,2, os-version: 17.4], [device: iPhone13,3, os-version: 15.0], [device: iPhone13,4, os-version: 16.0], [device: iPhone15,2, os-version: 16.0], [device: iPhone15,5, os-version: 18.0], [device: iPhone13,1, os-version: 16.0], [device: iPhone15,2, os-version: 18.0], [device: iPhone17,5, os-version: 26.0], [device: iPhone14,8, os-version: 18.0], [device: iPhone12,5, os-version: 15.0], [device: iPhone14,5, os-version: 18.0], [device: iPhone11,4, os-version: 15.0], [device: iPhone13,4, os-version: 15.0], [device: iPhone13,3, os-version: 17.4], [device: iPhone15,2, os-version: 26.0], [device: iPhone11,6, os-version: 16.0], [device: iPhone15,5, os-version: 26.0], [device: iPhone14,8, os-version: 16.0], [device: iPhone11,6, os-version: 17.4], [device: iPhone17,4, os-version: 18.0], [device: iPhone16,2, os-version: 18.0], [device: iPhone16,1, os-version: 26.0], [device: iPhone12,3, os-version: 18.0], [device: iPhone17,3, os-version: 26.0], [device: iPhone13,2, os-version: 17.4], [device: iPhone15,2, os-version: 17.4], [device: iPhone14,2, os-version: 15.0], [device: iPhone12,5, os-version: 17.4], [device: iPhone14,4, os-version: 17.4], [device: iPhone15,4, os-version: 26.0], [device: iPhone15,4, os-version: 17.4], [device: iPhone17,3, os-version: 18.0], [device: iPhone11,4, os-version: 16.0], [device: iPhone13,4, os-version: 17.4], [device: iPhone15,2, os-version: 17.0], [device: iPhone13,1, os-version: 17.4], [device: iPhone14,4, os-version: 17.0], [device: iPhone12,3, os-version: 16.0], [device: iPhone13,3, os-version: 17.0], [device: iPhone16,1, os-version: 18.0], and [device: iPhone14,7, os-version: 17.4]
App + On Demand Resources size: 154 KB compressed, 421 KB uncompressed
App size: 154 KB compressed, 421 KB uncompressed
On Demand Resources size: Zero KB compressed, Zero KB uncompressed- comparing builds
- tracking regressions
- evaluating the impact of added assets or dependencies before distribution
However, it remains an estimate and may differ slightly from the final processed values shown in App Store Connect.
• App Store Connect (After Upload)
Once the build is uploaded and processed, App Store Connect provides size information based on the App Store’s distribution configuration.
At this stage, you can see:
- device-specific download size
- install size
These numbers are closer to real-world distribution than local estimates.
• App Store Public Display
The App Store displays the app’s installed size on device, not including user-generated or cached data.
This value:
- may differ slightly from internal reports
- does not necessarily equal the exact network payload
It represents the installed size shown to users, not the actual network payload.
• Installed Size on Device
Finally, you can verify the real footprint directly on a device:
Settings → General → iPhone Storage
Here you see:
- App Size
- Documents & Data
This reflects the actual storage used after installation and unpacking.
In this example, the App Store value was very close to the estimated installed size from the App Thinning report, with only a small difference of a few kilobytes.
The download size was smaller, but this does not mean large apps become “lightweight” over the network.
Get Valerii Nikolaev’s stories in your inbox
Join Medium for free to get updates from this writer.
If an app installs as 400 MB, you should not expect a 150 KB download simply because of compression.
• A Simple Size Impact Example
Here’s what happens when you add a single ~8 MB PNG file to your project.
No additional code.
No new frameworks.
Just one bundled image.
After processing in App Store Connect, the following sizes were reported for iPhone 17 Pro:
Before adding the PNG:
Download size: 157 KB
Install size: 541 KB
After adding the PNG:
Download size: 8.16 MB
Install size: 8.53 MB
A single asset dramatically changed the download and installed size of the app.
Bundled resources directly affect both network transfer and on-device storage.
• Summary
Different tools show different size values because they measure different stages:
- Local build artifacts
- Estimated sliced size
- App Store processed size
- Public display value
- Installed storage footprint
If you don’t clearly define which metric you’re optimizing, you risk optimizing the wrong one.
App size is not a single number. It’s a layered result of build, processing, distribution, and installation.
3. How to Reduce App Size (Apple’s Checklist)
Reducing app size is not about one trick.
It is a series of practical decisions that compound over time.
• Basic Optimization (Do This First)
These steps apply to almost every iOS app.
• Optimize and compress assets
Images are often the largest contributor to size.
- Use optimized PNGs
- Avoid shipping oversized images
- Resize assets to actual display dimensions
- Prefer vector assets (PDF / SF Symbols) where appropriate
A single high-resolution image can outweigh your entire binary.
• Remove unused resources
Audit your bundle carefully.
Check for:
- test files accidentally included
- unused JSON or sample data
- outdated PDFs
- demo media
- development leftovers
Verify the Copy Bundle Resources phase.
What is in your project is not always what ships.
• Review Embedded Frameworks and SDKs
Every dependency adds weight.
Ask:
- Is this SDK necessary?
- Is there a lighter alternative?
- Can it be modularized?
- Do I really need the entire library for this feature?
In many cases, a small portion of functionality is required, but the full framework is linked into the app.
Sometimes it is more efficient to implement a focused solution instead of importing a large dependency.
Third-party libraries often dominate size in small apps.
• Make Sure Dead Code Stripping Is Enabled
For Release builds:
- Dead Code Stripping = YES
- Strip Debug Symbols During Copy = YES
Unused code and symbols should not be included in the production binary.
• Make Sure the Release Configuration Is Optimized
Ensure that:
- Optimization Level is set to -O or -Osize
- Debug logging is removed
- No debug flags remain enabled
Debug builds are not representative of production size and should not be used to estimate distribution footprint.
• Advanced Optimization (When Basic Is Not Enough)
These steps matter when size becomes a real constraint.
• Move large assets to On-Demand Resources
If your app includes:
- large media files
- optional feature packs
- tutorials
- downloadable content
Load them on demand instead of bundling everything upfront.
This reduces initial download size.
• Re-evaluate heavy dependencies
Measure the size impact of each SDK.
Sometimes removing a single library reduces size more than micro-optimizing assets.
• Use App Thinning strategically
Structure your project so slicing works in your favor.
- Avoid bundling assets for all device classes unnecessarily
- Use asset catalogs correctly
- Separate optional content
App Store slicing reduces per-device download size, but your bundle structure determines the outcome.
4. Pre-Release Size Checklist (Practical Workflow)
The simplest and fastest workflow looks like this:
- Generate a local App Thinning Size Report in Xcode.
- Check both download size and installed size for representative devices.
- If the numbers are acceptable — proceed with upload.
- If not — optimize before shipping.
- When optimizing, review:
- Large bundled resources
- Embedded frameworks and SDKs
- Release build flags and optimization settings
- Unused assets in Copy Bundle Resources
- Generate the App Thinning report again.
- Compare the new numbers with the previous build.
Repeat until the size is within acceptable limits.
This keeps the process simple:
Measure → Optimize → Measure again.
App size should be validated locally before distribution, not discovered after release.
5. Conclusion
App size reflects different stages of the app lifecycle — build, distribution, and installation.
Personally, I don’t want my app to get “out of shape” and grow unnecessarily heavy.
During development, I regularly review the resources I add to the bundle.
If I’m tempted to include a trendy new library, the first question I ask is simple:
Does Apple already provide a native solution?
Optimize intentionally, not blindly.
App size should be observed, understood, and verified — not guessed.
It is a discipline.
And a form of respect — for the user’s device, storage, network constraints, and time.
References
Apple Documentation:
- App Thinning Overview
- https://developer.apple.com/library/archive/documentation/IDEs/Conceptual/AppDistributionGuide/AppThinning/AppThinning.html
- Reducing Your App’s Size
- https://developer.apple.com/documentation/xcode/reducing-your-app-s-size
- Building Your App for App Store Distribution
- https://developer.apple.com/documentation/xcode/distributing-your-app-for-beta-testing-and-releases








