开发证书到期那几天,App 为什么突然装不上了

开发证书到期那几天,App 为什么突然装不上了

事情发生在周五下午。同事在群里发了一张截图,真机上那个测试版 App 的图标灰了,点一下弹出来一句「无法验证 App」,下面是「互联网连接似乎已断开」或者直接说描述文件已失效。他说昨天还好好的,今天一开机就这样了。

第一反应往往是去查网络、重启手机、重新插数据线,折腾一圈没结果。真正的原因,八成不在手机那头,而在电脑这头——签名证书到期了。

iOS 的测试包不是随便就能装到手机上的,它要靠一张开发证书加上一段描述文件来「签字画押」。证书有有效期,最常见的是签一年。到期那天,之前装好的测试版并不会立刻全部罢工,而是等系统重新校验的时候才露馅:重启手机、过了某个时间点、或者描述文件里的设备名单有了变动,App 就突然变成「无法验证」了。

所以碰到这种情况,先别急着改代码。倒推一下时间线:这张证书是什么时候申请的,当时选的是个人账号还是公司账号,有效期到哪天。多数人记不住这个日期,但能从一个地方看——打包工具里证书列表那一栏,会标出来剩余天数。剩三十天的时候它还是绿的,剩三天的时候它已经该让你心里一紧了。

我见过最冤的一种,是证书其实没到期,是描述文件到期了。这两个东西经常被当成一个,其实不是一回事。证书管「这个包是谁签的」,描述文件管「这个包能被装到哪些设备上、能开哪些能力」。描述文件有效期一般更短,而且它跟证书、跟设备列表绑在一起。你在后台加了一台新手机的 UDID,重新生成描述文件,旧的那份就不算数了,老设备上装过的测试版也会跟着失效。所以「昨天还能装,今天不能装」,很多时候是新加了设备、动了描述文件,而不是证书过期。

还有一个更隐蔽的坑:换电脑。开发证书是跟电脑的私钥绑定的。你在原来那台 Mac 上打包,证书里有对应的私钥,签名是完整的。换了台新电脑,从后台把证书下载下来,结果发现没有私钥,打包报错「找不到可用的签名身份」。很多人这时候以为是证书坏了,去后台折腾半天,其实缺的是私钥——它只存在于你原来那台电脑的钥匙串里。这也是为什么有人会专门做「证书和私钥一起备份」这个动作,文件后缀 .p12 的那个东西,导出来存好,换电脑、重装系统的时候才不至于抓瞎。

把上面几条捋清楚,排查顺序其实是反着来的:先看现象,再看时间,最后看关联。

现象是「装不上」,就分两类。一类是「无法验证 App」,多半是证书或描述文件到期、或者设备不在描述文件名单里;一类是打包阶段就报错,多半是私钥缺失、或者证书和描述文件不匹配。先把这两类分开,能省掉一大半冤枉路。

时间上,去打包工具里看证书和描述文件的到期日,把两个日期都记下来。剩的天数越少,嫌疑越大。如果时间对不上——比如明明没到期却装不上——那基本可以锁定是描述文件或者设备名单动了。

最后看关联:描述文件里绑定的那串设备 UDID,跟现在要装的那台手机对不对得上;私钥在不在当前这台电脑上。这两处是最容易被人忽略、又最容易一击即中的。

说句实在话,这类问题不复杂,复杂的是它总在关键时刻出现——上线前一晚、客户催测试的当口。与其每次临时抓瞎,不如把证书的到期日当成一个固定要盯的事。有人用手机日历设提醒,提前半个月标一下;有人干脆走打包托管,把证书和描述文件托管在服务端,到期、失效由平台统一维护。两条路都行,关键是别等它炸了才想起来看日期。

最后留一句提醒:证书这事没有「凑合」的余地。它过期就是过期,不因为你急着上线就宽限几天。真到了那一刻,能做的只有重新生成、重新打包、重新装机。所以早点看清楚那张证书还有几天,比什么都强。