IPA 为什么无法安装?
将安装包装到测试设备上时,失败的原因大约有六种,而 iOS 对其中大多数只给出同一条笼统的提示。下面介绍如何快速区分它们。
先确认安装包的类型
| 签名类型 | 可安装到 | 说明 |
|---|---|---|
| 开发(Development) | UDID 在描述文件中的设备 | 团队内部包的常见类型 |
| Ad Hoc | UDID 在描述文件中的设备,上限 100 台 | 面向更大范围的测试人员 |
| 企业(Enterprise) | 任意设备,需信任证书 | 仅限内部分发 |
| App Store | 无法直接安装到任何设备 | 仅为商店分发签名 |
最后一行最容易让人困惑。App Store 签名的包始终无法侧载。如果有人把提交审核的包交给您,询问为什么装不上,原因就在于此。
原因一:设备不在描述文件中
症状: 立即失败,提示笼统的签名错误。
开发或 Ad Hoc 描述文件中嵌入了一份允许安装的设备 UDID 列表。设备不在列表中,安装尚未开始就会终止。
解决方法: 读取设备 UDID,在开发者后台将其添加到描述文件中,重新生成描述文件,然后重新打包。必须重新打包,因为描述文件嵌入在 IPA 中,在后台修改描述文件对已有的安装包没有任何影响。
原因二:描述文件已过期
症状: 与原因一完全相同,但整批设备在同一天全部失效。
开发描述文件会过期(通常为一年),证书也会过期。当整批测试设备同时无法安装时,基本可以确定是这个原因。
解决方法: 续期、重新打包、重新分发。区分「过期」与「UDID 问题」的依据是:过期会同时影响所有设备,包括昨天还正常的设备。
原因三:存储空间不足
症状: 开始安装后,中途失败。
安装过程需要同时容纳安装包和解包后的应用,因此一个 200 MB 的 IPA 需要的可用空间远不止 200 MB。在仅剩 1 GB 的设备上安装大型 App,结果会时好时坏。这比稳定失败更麻烦,因为它看起来像是一个间歇出现的签名问题。
解决方法: 在排查其他原因之前,先检查剩余空间。只需几秒,却可能节省一小时。
原因四:版本号回退
症状: 提示「已安装此应用的更新版本」。
iOS 不允许直接降级。如果设备上是 build 412,而您要安装 build 409,在删除旧版本之前无法安装。
解决方法: 先卸载。卸载前请导出所需的沙盒数据,因为卸载会同时删除这些数据。
原因五:开发者未受信任
症状: 安装成功但无法打开,弹窗提示开发者未受信任。
这实际上并不是安装失败。App 已在设备上,只是 iOS 不会运行由用户尚未信任的证书签名的代码。
解决方法: 在设备上进入 设置 → 通用 → VPN 与设备管理,找到该开发者并点击信任。每台设备的每个证书只需信任一次。
原因六:描述文件未包含所需能力
症状: 立即失败,错误信息中可能会提到 entitlements。
App 申请了某项能力(如推送、App Groups、HealthKit、关联域名),但描述文件中未包含。签名本身有效,但权限不匹配。
解决方法: 在 App ID 上启用该能力,重新生成描述文件,然后重新打包。
高效的排查顺序
- 剩余存储空间。 只需几秒,而且是很常见的原因。
- 设备 UDID 是否在描述文件中? 从设备上读取 UDID,不要依赖表格。
- 描述文件是否过期? 查看日期,并确认其他设备是否同时失效。
- 是否已安装更高版本? 卸载前先比较版本号。
- 是否已安装但无法打开? 这是信任问题,而非签名问题。
- 最后再检查 entitlements。
测试设备的日常维护
只要持续更新以下三项,上述大部分问题都不会再出现:一份与实体设备一致的 UDID 清单、一份各描述文件到期时间的记录,以及在设备加入或离开测试机队时检查已安装描述文件的习惯。每项只需五分钟,却能节省日后大量的排查时间。
