写这篇文章的起因是要更新 app ,然而上传 ipa 文件到 iTunes Connect 时发现体积巨大,是 App Store 显示的体积的好几倍,于是仔细研究了一下,各种体积的文件都是些什么。

各格式简要说明

.xcarchive
- Xcode Archive
- 由 Xcode 进行 Archive 操作产生的结果,出现在 Xcode Organizer 中
- 主要包含 .dSYM .app .dylib(针对 Swift)
- 用于生成 .ipa 文件

.ipa(Xcode 产出)
- iPhone Application Archive
- 主要包含 .app .dylib(针对 Swift)
- 最终从本地 upload 到 iTunes Connect 的文件

.ipa(iTunes 下载)
- iPhone Application Archive
- 主要包含 .app iTunesMetadata iTunesArtwork
- iTunes 用于管理应用软件安装包的形式

.app
- Applicaiton
- 主要包含图片、语言文件等资源,以及动态库和 Unix 可执行文件
- 安装到 iOS 设备的文件的格式

从 xcarchive 到 ipa

在进行 Archive 操作之前,我们就可以在 Xcode 导航栏的 Products 目录中看到 .app 文件,extension target 对应的是 .appex 文件,所以归档出 .xcarchive 并不是一个非常复杂的操作,只需要编译、链接、简单的签名,如果是 Swift 项目的话还需要拷贝一下标准库。

我们查看 .xcarchive 里面的内容是通过“显示包内容”看见的,而 .ipa 则需要像 .zip 文件一样解压,那么也可以理解为什么打包出 ipa 文件相对耗时了,尤其是 Swift 项目,不光要进行压缩操作,要 processing,一堆原生动态库加上第三方 framework 还要轮着等着签名。

这些保证了 ipa 文件不能被模拟器装上(没有 x86 架构),只能被 iOS 设备安装,你买的应用程序发给别人,别人并不能直接装上。从兔兔助手等平台安装的盗版软件一定是被重新签名过的。
(由于 ipa 文件上传到 iTunes Connect 之后,还会被重新处理,所以个人尚且不知道后续的处理过程还进行过怎样的签名工作)

所以 ipa 文件才可以作为加密文件放在软件商店,xcarchive 不可以。

从 Xcode 产出的 ipa 到用户下载的 ipa

如图是我开发的一款软件打包过程的各个状态,可以看到压缩状态的 ipa 文件是体积最小的。如果将 ipa 文件解压成文件夹,它的体积会和 xcarchive 文件很接近,因为它内部包含了比它本身还要大的整个 .app 包。

然后我分别通过 AppStore 和 TestFlight 安装了我上传的软件,结果都只占用了大约 15M 的空间。
前面提到,下载到设备的是 ipa,安装到设备的是 app。但看图,会发现 TestFlight 页面展示的体积和另外三张图相去甚远,30M+。仔细分析下:

  1. iPhone 5S 推出之后,iOS 设备指令集从 armv6、armv7、armv7s 一路干到了 arm64,这么些个不同的设备安装到本地的文件肯定不一样吧
  2. 同一设备不同系统,安装的文件也不一样吧
  3. Xcode 一次只产出一个 ipa,但是考虑到这款软件支持的系统版本数量和设备种类数量,可能最终几十种不同的 iOS 环境(自造词,系统版本或设备型号不同都算环境不同),从同一个 AppStore 页面,下载了几十个不同的 ipa 文件
  4. 尝试发布过 app 的开发者都知道,上传 ipa 文件完成之后,还要等待一段时间,才能在 iTunes Connect 页面看见一个“构建版本”。虽然不知道这个“构建版本”在 Apple 的服务器里面具体都有哪些东西,但至少应该包含一大堆的 ipa 文件,分别指定了对应什么系统版本、什么设备型号
  5. 在这个过程中 ipa 文件的体积发生了很大变化,App Thining 也发生在这个过程中。

至此可以看出,AppStore 页面显示的体积应该是预估的应用安装到设备的体积,而不是你下载这款软件所耗费的流量。这也解释了我之前尝试用剩 1G 存储的 iPad 去装一个 AppStore 显示 大小不到 1G 的游戏,为什么会装不上,因为下载到 iPad 的文件实际可能大于 1G。

TestFlight 里面显示的 30M+,肯定是经过 iTunes Connect 处理过的 ipa,但考虑到 .ipa 文件并不会比安装到设备的 .app 包体积更小,个人认为这是解压过后的 ipa 文件的体积。

我的 app 是如何一步一步变小的

未处理的 .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 瘦身功能

【iOS 开发】从 xcarchive 到分发的 ipa相关推荐

  1. 从 xcarchive 到分发的 ipa

    写这篇文章的起因是要更新 app ,然而上传 ipa 文件到 iTunes Connect 时发现体积巨大,是 App Store 显示的体积的好几倍,于是仔细研究了一下,各种体积的文件都是些什么. ...

  2. IOS开发(22)之生成IPA文件并安装到越狱后的真机上

    1 前言 本文为临时加塞,由于工作需要,公司要求将Xcode中的项目生成IPA文件,用于版本记录,由于没有咱们木有开发者账号,所以需要另类的IPA生成和发布方式,今天折腾了一番终于搞定了,特此与大家分 ...

  3. 苹果iOS App上架流程,非iOS开发人员上架教程

    iOS应用上线发布流程一般包含相关证书文件的配置.Xcode的设置.App Store Connect填写App的相关信息.ipa包上传.审核结果以及相关邮件回复.相关证书文件的配置与Xcode的设置 ...

  4. iOS开发:Archive、ipa 和 App 包瘦身

    作者 | 钱凯 杏仁移动开发工程师,前嵌入式工程师,关注大前端技术新潮流. iOS 开发的最后一步就是进行 App 的打包和分发,这里分为两个步骤: Archive:对Target进行编译.归档,生成 ...

  5. 软件测试ios打包,ios开发怎样将打包ipa发送给测试人员

    ios开发怎样将打包ipa发送给测试人员 需要打包之前做点工作,把开发人员的手机UUID填写到证书的申请里边(开发者中心Devices一栏),或者放到蒲公英也可以 如何通过ipa 查看ios app是 ...

  6. AIR for IOS开发问题小结

    昨天终于成功地向APP STORE提交了应用,个人感觉用AIR做IOS开发就是个坑啊.出了问题之后,问苹果的技术支持,人家说"对于非XCODE环境下开发及发布所造成的问题我们在资料库中无法找 ...

  7. iOS开发-证书问题精析~

    在iOS开发过程中,不可避免的要和证书打交道,真机调试.App上架.打包给测试去测试等都需要搞证书.在此过程中我们会遇到很多的问题,但是如果掌握了真机调试的原理和本质:遇到问题,我们就更容易定位问题之 ...

  8. 最佳实践(2):iOS开发篇

    本文由 伯乐在线 - 戴仓薯 翻译,dopcn 校稿.未经许可,禁止转载! 英文出处:futurice.欢迎加入翻译组. 这份文档就像软件项目一样,如果我们不维护它就会逐渐腐坏.欢迎大家跟我们一起来维 ...

  9. 配置 Visual Studio 2019以进行 iOS 开发

    前言 在安装vs2019时有个选项:在vs2019中进行Android和ios开发,是不是普大喜空,再次膜拜地表最强IDE vs2019,幻想着在windows下跑Android和Ios程序..... ...

最新文章

  1. android 原生分享界面_手机资讯:省时省力!直接在锁屏界面打开应用App
  2. 启动MySQL报错:ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)
  3. python json unicode_python2下解决json的unicode编码问题
  4. LeetCode 1480 一维数组的动态和
  5. 罗格斯大学电子与计算机系排名,罗格斯大学美国大学排名及专业排名汇总(USNEWS美国大学排名版)...
  6. 跨越全场景统一架构三大挑战,MindSpore亮出“四招”
  7. Tree Context Menu
  8. 在IIS上部署ASP.NET Core Web API
  9. 怎样看win10是不是永久激活的?
  10. python 文件行数_python—文件和数据(文件行数 文件字符分布)
  11. 海军装备、舰船电子设备|环境可靠性试验|GJB150A\GJB4
  12. python种子数是什么意思_Python:随机种子问题
  13. 股价屡创新高,发布会带来“十三香”,苹果还能躺赢?
  14. wordpress企业网站主题
  15. Flutter中获取监听屏幕方向、锁定屏幕方向
  16. C语言 ltoa sprintf strcat
  17. windows 子系统 linux (WLS):启用Win10的Linux子系统
  18. AS 项目目录组成架构
  19. Delphi中文帮助[1]Delphi7的新特性
  20. 【学习python语法】

热门文章

  1. 腾讯AI Lab研发「智能显微镜」 抢先布局病理分析领域
  2. JavaScript:回调函数(callback)
  3. UG12软件使用配置
  4. 替换输入的密码为星号【C语言】
  5. python+opencv实现多张图像拼接_附源码
  6. NTFS文件系统详解(一)之硬盘基本信息
  7. ISO/ASME 几何尺寸和公差(GDT)课程大纲
  8. JavaScript跳转和打开新窗口
  9. 阿里新制造平台首落地,腾讯智能制造三大战略,BAT能否搅活制造这摊死水?
  10. Linux 命令 | 常用命令之 sort