【iOS 开发】从 xcarchive 到分发的 ipa

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

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

各格式简要说明

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


img_00d6d7a4c9a9a92dc05ef98465b54d87.jpe

.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 还要轮着等着签名。


img_b567745531cfb4f7dcdfe285263f6166.jpe

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

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

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

img_d1712b28a28594b158b903a2543093a6.jpe

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


img_9f04b200058f482e361c7795e30296b4.jpe

然后我分别通过 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 瘦身功能

目录
相关文章
|
10天前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
18天前
|
开发框架 数据可视化 Java
iOS开发-SwiftUI简介
iOS开发-SwiftUI简介
|
20小时前
|
设计模式 安全 Swift
探索iOS开发:打造你的第一个天气应用
【9月更文挑战第36天】在这篇文章中,我们将一起踏上iOS开发的旅程,从零开始构建一个简单的天气应用。文章将通过通俗易懂的语言,引导你理解iOS开发的基本概念,掌握Swift语言的核心语法,并逐步实现一个具有实际功能的天气应用。我们将遵循“学中做,做中学”的原则,让理论知识和实践操作紧密结合,确保学习过程既高效又有趣。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你打开一扇通往iOS开发世界的大门。
|
1天前
|
搜索推荐 IDE API
打造个性化天气应用:iOS开发之旅
【9月更文挑战第35天】在这篇文章中,我们将一起踏上iOS开发的旅程,通过创建一个个性化的天气应用来探索Swift编程语言的魅力和iOS平台的强大功能。无论你是编程新手还是希望扩展你的技能集,这个项目都将为你提供实战经验,帮助你理解从构思到实现一个应用的全过程。让我们开始吧,构建你自己的天气应用,探索更多可能!
10 1
|
6天前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
25 7
|
10天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台解决方案
【9月更文挑战第27天】在移动应用开发的广阔天地中,安卓和iOS两大操作系统如同双子星座般耀眼。开发者们在这两大平台上追逐着创新的梦想,却也面临着选择的难题。如何在保持高效的同时,实现跨平台的开发?本文将带你探索跨平台开发的魅力所在,揭示其背后的技术原理,并通过实际案例展示其应用场景。无论你是安卓的忠实拥趸,还是iOS的狂热粉丝,这篇文章都将为你打开一扇通往跨平台开发新世界的大门。
|
16天前
|
前端开发 iOS开发 开发者
探索iOS开发中的SwiftUI框架
【9月更文挑战第21天】在iOS应用开发的广阔天地中,SwiftUI框架如一股清新之风,为开发者带来了声明式语法的便捷与高效。本文将深入探讨SwiftUI的核心概念、布局方式及数据绑定机制,同时通过实例演示如何运用SwiftUI构建用户界面,旨在引领读者领略SwiftUI的魅力,并激发其对iOS开发新趋势的思考与实践。
33 6
|
16天前
|
安全 Swift iOS开发
探索iOS开发之旅:Swift语言的魅力与挑战
【9月更文挑战第21天】在这篇文章中,我们将一起潜入iOS开发的海洋,探索Swift这门现代编程语言的独特之处。从简洁的语法到强大的功能,Swift旨在让开发者能够以更高效、更安全的方式构建应用程序。通过实际代码示例,我们会深入了解Swift如何简化复杂任务,并讨论它面临的挑战和未来的发展方向。无论你是初学者还是有经验的开发者,这篇文章都将为你提供新的视角和知识。
31 4
|
25天前
|
API Android开发 iOS开发
安卓与iOS开发中的线程管理对比
【9月更文挑战第12天】在移动应用的世界中,安卓和iOS平台各自拥有庞大的用户群体。开发者们在这两个平台上构建应用时,线程管理是他们必须面对的关键挑战之一。本文将深入探讨两大平台在线程管理方面的异同,通过直观的代码示例,揭示它们各自的设计理念和实现方式,帮助读者更好地理解如何在安卓与iOS开发中高效地处理多线程任务。
|
10天前
|
iOS开发 Python
6-8|如何使用Python语言开发IOS混淆工具
6-8|如何使用Python语言开发IOS混淆工具