详解 UDID、证书与描述文件
iOS 代码签名由四个部分组成。常见的讲解顺序沿用苹果开发者后台的界面布局,但那并不是最易于理解的顺序。下面按更易理解的顺序说明。
四个组成部分
证书说明您是谁。它由苹果签发给开发者或团队,与私钥一起存放在钥匙串中,并且会过期(通常为一年)。私钥丢失后证书即失效,只能重新签发。
App ID 说明是哪个 App。它由 Bundle ID 和该 App 被允许使用的能力清单组成,例如推送、App Groups、HealthKit、关联域名等。
设备即一个 UDID,是某台实体 iPhone 或 iPad 的唯一标识。苹果开发者计划对每年每种设备类型可注册的数量设有上限。
描述文件(Provisioning Profile) 将前三者绑定在一起:允许该证书为该 App ID 签名,并安装到这些设备上。描述文件会过期,并在打包时嵌入 IPA。
最后一句是最值得记住的。
为什么修改描述文件没有效果
描述文件是打包时嵌入安装包的。在开发者后台向描述文件添加设备 UDID,对已经生成的 IPA 没有任何影响,硬盘上那个文件中包含的仍是旧的描述文件和旧的设备列表。
因此,正确顺序始终是:添加 UDID → 重新生成描述文件 → 重新打包 → 重新分发。每年都有团队在这一步上浪费数小时,通常是添加设备后又分发了同一个包,然后疑惑为何仍无法安装。
如何获取 UDID
UDID 是设备的属性,而非账号的属性,必须从实体设备上读取。
不要从多年前维护的表格中复制。在我们见过的「为什么装不上」工单中,约一半最终发现 UDID 属于一台团队早已不再使用的设备,而它来自一份无人核对的清单。
各类描述文件的适用范围
| 描述文件 | 签名证书 | 可安装到 |
|---|---|---|
| 开发 | 开发证书 | 仅限已注册设备 |
| Ad Hoc | 分发证书 | 已注册设备,每种类型上限 100 台 |
| 企业 | 企业证书 | 任意设备,需用户信任证书 |
| App Store | 分发证书 | 无法直接安装,仅用于提交商店 |
有两点需要牢记:
- App Store 包始终无法侧载。这不是 bug,也没有可以开启的选项。
- 企业分发仅限组织内部使用。用于面向公众分发属于违规行为,会导致证书被吊销,而这会使所有用该证书签名的 App 的全部安装同时失效。
为什么安装包会突然失效
因为某项内容过期了。过期由日期决定,而不是由某个事件触发,所以不会有任何提醒。
- 证书过期。 所有使用该证书的描述文件同时失效,所有安装包都无法安装。
- 描述文件过期。 对应 App 的安装包无法安装。
- 证书被吊销。 效果与过期相同,但立即生效,通常是有人在清理后台时操作的。
典型特征是:昨天还正常,没人改动过任何内容,所有设备同时出现问题。如果只有一台设备出现问题,那是 UDID 问题,而非过期问题。
「信任」这一步
开发包或企业包安装后,在用户于设备上信任该证书之前无法启动。信任路径为:设置 → 通用 → VPN 与设备管理。
这一步很容易让人困惑,因为安装是成功的。没有任何报错,App 已出现在主屏幕上,只是无法打开。每台设备的每个证书只需信任一次。
如何避免问题反复出现
以下三个习惯,每个大约只需五分钟:
- 维护一份与实际一致的设备清单。 设备加入测试机队时,从实体设备上读取 UDID,不要凭记忆填写。
- 记录到期时间。 将证书和描述文件的到期时间写入日历,「某天突然失效」这一类问题就不会再出现。
- 设备加入或离开机队时检查一遍。 确认设备上安装了哪些描述文件,是否有不是您安装的。
这些工作并不有趣,但每一项都比它所避免的排查成本低得多。
