这个 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 清单、一份各描述文件到期时间的记录,以及“设备进出机队时审一遍已装描述文件”的习惯。三件事都只要五分钟,每一件都能省下之后的一个下午。
