UDID、证书和描述文件,一次讲清
iOS 代码签名有四个部件,讲解的顺序通常跟着苹果后台的界面走 —— 而那不是讲得通的顺序。下面是讲得通的那个顺序。
四个部件
证书说明你是谁。由苹果签发给某个开发者或团队,和私钥一起存在钥匙串里,会过期 —— 通常一年。私钥丢了,证书就废了,只能重新签发一个。
App ID 说明是哪个 App。它是 Bundle ID,加上这个 App 被允许使用的能力清单 —— 推送、App Groups、HealthKit、关联域名等等。
设备就是一个 UDID:某一台实体手机或平板的唯一标识。苹果开发者计划对每年每种类型可注册的设备数量有上限。
描述文件(Provisioning Profile) 把前三者绑在一起:这个证书可以给这个 App ID 签名,并装到这些设备上。它会过期。它在打包时被嵌进 IPA 里。
最后这句话是最值得记住的。
为什么改了描述文件没有用
描述文件是烤进包里的。你在开发者后台往描述文件里加一个设备 UDID,对任何已经存在的 IPA 都毫无影响 —— 你硬盘上那个文件里装的还是旧的描述文件、旧的设备列表。
所以顺序永远是:加 UDID → 重新生成描述文件 → 重新打包 → 重新分发。每年都有团队在这上面浪费好几个小时,通常是加完设备把同一个包又发了一遍,然后困惑于它还是装不上。
UDID 从哪来
UDID 是设备的属性,不是账号的属性。你得从那台实体手机上拿。
不要从某个 2023 年有人维护过的表格里抄。我见过的“为什么装不上”工单里,有一半最后查出来 UDID 属于一台团队早就没有的设备,是从一份没人核对过的清单里抄进去的。
描述文件类型,各自允许什么
| 描述文件 | 用什么签 | 能装到 |
|---|---|---|
| 开发 | 开发证书 | 仅已注册设备 |
| Ad Hoc | 分发证书 | 已注册设备,每种类型上限 100 台 |
| 企业 | 企业证书 | 任意设备,用户信任之后 |
| App Store | 分发证书 | 直接装不了 —— 只能提交商店 |
有两个后果值得记牢:
- App Store 包永远无法侧载。这不是 bug,也没有什么开关。
- 企业分发是给自己组织内部用的。拿它对公众分发是违规,结局是证书被吊销 —— 那会让用它签过的每一个 App 的每一次安装全部失效。
为什么包会在某个周二突然失效
因为有东西过期了,而过期是一个日期而不是一个事件,所以没有任何东西提醒你。
- 证书过期。 所有用它的描述文件同时失效,所有包一起装不上。
- 描述文件过期。 那个 App 的包装不上。
- 证书被吊销。 和过期一样,但是立即生效,而且通常是有人在清理后台。
特征永远是:昨天还好好的,没人改过任何东西,所有设备同时坏掉。如果只有一台设备坏,那是 UDID 问题,不是过期问题。
“信任”这一步
装上的开发或企业包在用户于设备上信任证书之前不会启动:设置 → 通用 → VPN 与设备管理。
这一步很容易把人绊住,因为安装成功了。什么都没失败,App 就在主屏幕上,只是打不开。每台设备每个证书做一次。
怎么让它不再反复发生
三个习惯,每个大约五分钟:
- 一份和现实对得上的设备清单。 设备进机队时从实体设备上读 UDID,别凭记忆。
- 一份到期时间记录。 证书和描述文件,记进日历。“周二突然坏了”这一整类问题就消失了。
- 设备进出机队时审一遍。 上面装了哪些描述文件,有没有不是你放上去的。
这些活都不有趣,但每一件都比它替掉的那个下午便宜。
