写这篇文章的原由是要更新 app ,然而上传 ipa 文件到 iTunes Connect 时发现体积巨大,是 App Store 显示的体积的好几倍,因而仔细研究了一下,各类体积的文件都是些什么。javascript
.xcarchivehtml
- Xcode Archive
- 由 Xcode 进行 Archive 操做产生的结果,出如今 Xcode Organizer 中
- 主要包含 .dSYM .app .dylib(针对 Swift)
- 用于生成 .ipa 文件复制代码
.ipa(Xcode 产出)java
- iPhone Application Archive
- 主要包含 .app .dylib(针对 Swift)
- 最终从本地 upload 到 iTunes Connect 的文件复制代码
.ipa(iTunes 下载)xcode
- iPhone Application Archive
- 主要包含 .app iTunesMetadata iTunesArtwork
- iTunes 用于管理应用软件安装包的形式复制代码
.app服务器
- Applicaiton
- 主要包含图片、语言文件等资源,以及动态库和 Unix 可执行文件
- 安装到 iOS 设备的文件的格式复制代码
在进行 Archive 操做以前,咱们就能够在 Xcode 导航栏的 Products 目录中看到 .app 文件,extension target 对应的是 .appex 文件,因此归档出 .xcarchive 并非一个很是复杂的操做,只须要编译、连接、简单的签名,若是是 Swift 项目的话还须要拷贝一下标准库。架构
咱们查看 .xcarchive 里面的内容是经过“显示包内容”看见的,而 .ipa 则须要像 .zip 文件同样解压,那么也能够理解为何打包出 ipa 文件相对耗时了,尤为是 Swift 项目,不光要进行压缩操做,要 processing,一堆原生动态库加上第三方 framework 还要轮着等着签名。
app
因此 ipa 文件才能够做为加密文件放在软件商店,xcarchive 不能够。ide
至此能够看出,AppStore 页面显示的体积应该是预估的应用安装到设备的体积,而不是你下载这款软件所耗费的流量。这也解释了我以前尝试用剩 1G 存储的 iPad 去装一个 AppStore 显示 大小不到 1G 的游戏,为何会装不上,由于下载到 iPad 的文件实际可能大于 1G。ui
TestFlight 里面显示的 30M+,确定是通过 iTunes Connect 处理过的 ipa,但考虑到 .ipa 文件并不会比安装到设备的 .app 包体积更小,我的认为这是解压事后的 ipa 文件的体积。加密
未处理的 .app - 85.6 M
(加入动态库、.dSYM 等)
xcarchive - 167.7 M
未处理的 ipa 文件夹 - 172 M
(通过相似 zip 压缩)
未处理的 .ipa - 70.8 M(开发者感觉到的体积)
(我的推测)处理后的 ipa 文件夹- 约 30M(用户下载须要耗费的流量)
处理后的 .app - 约 15M(最终占用用户设备体积)
App Thining 包含 Slicing、Bitcode 和 On-Demand Resources,其中 Slicing 是默认启用、没法关闭的,但只在 iOS 9.0.2 以后有效,后面两个选项在 Xcode 中默认开启,能够手动关闭。
这是 Xcode 产物体积与用户下载到设备中的软件体积差距较大的主要缘由。
推荐阅读:初探 iOS 9 的 App 瘦身功能