克魔助手
全部文章

这个 IPA 为什么装不上

4 分钟阅读分发设备

把一个包装到测试机上,失败的方式大概有六种,而 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 上开启该能力,重新生成描述文件,重新打包。

一个省时间的排查顺序

  1. 剩余存储。 五秒钟,而且是出人意料常见的答案。
  2. 设备 UDID 在不在描述文件里? 从设备上读 UDID,别信表格。
  3. 描述文件过期了吗? 看日期,也看别的设备是不是同时失效的。
  4. 是不是已经装了更新的版本? 卸载任何东西之前先比版本号。
  5. 是装上了但打不开吗? 那是信任问题,不是签名问题。
  6. 到这一步再去读 entitlements。

测试机队的卫生习惯

只要保持三件事是最新的,上面这些大部分就不会再发生:一份和实体设备真正对得上的 UDID 清单、一份各描述文件到期时间的记录,以及“设备进出机队时审一遍已装描述文件”的习惯。三件事都只要五分钟,每一件都能省下之后的一个下午。