
周二下午三点多,群里跳上来一个 p12 文件,后面跟着一句“密码写文件名里了”。十分钟后,另一个人回了句:装是装上了,打包还是打不开。我在屏幕前停了一下——这种对话,一年能碰上十几回。
它几乎不是技术问题。代码没动,账号没欠费,就是那套东西没凑齐。很多人把苹果证书配置理解成“导出一个 p12 发过去”,等真到了同事那台电脑上,缺的东西才一样一样冒出来。
(这一段是几种常见情形拼在一起写的,不是某位客户的原话。)
先把这四样摆开
一套能用的签名配置,是四件东西配在一起,不是一件。
证书,落在你电脑钥匙串里的一对钥匙。公钥在苹果那边,私钥只在你这台机器上。导出成 p12 的时候会让你设密码,这个密码不是你的 Apple 账号密码,是你自己起的一个口令,丢了没人能替你想起来。
App ID,也就是 Bundle ID,这套配置服务的对象。一个 App 一个,写错了,后面全对不上。
描述文件,把 App ID、证书、设备名单三者绑在一起的那张东西。苹果的账户帮助里写得很清楚:编辑描述文件的时候,可以改 App ID、加证书、换一组设备;证书一旦撤销、设备停用、描述文件到期,都得回来重新编辑或者重新生成。它不是一张可有可无的附件,它是“谁有权把这个包装上去”的凭据。
推送,要发通知才用得上。可以是每个 App 各自一张 Apple Push Services 证书,也可以用一把 APNs Auth Key 代替,后者一把能管多个 App,省事一些。
拿配一把能用一年的门钥匙打比方,大概也是这个道理:锁芯是 App ID,钥匙是证书,写清“谁能进、拿哪把钥匙”的那张通行证是描述文件,对讲系统是推送。少一样,门就在那儿,你进不去。
你现在是哪一种
下面几种处境,对上的东西不一样。对着看,别整套照搬。
只在自己一台电脑上装真机看效果
开发证书加一份开发描述文件就够了,Xcode 里登录账号让它自动管也行。要注意一件事:开发证书是跟着人走的,证书名字后面会带上电脑名,所以同事电脑上那张,名字再像也不是你的。换机器的时候,别指望它自己跟过来。
要把包传到 App Store Connect 去
这时候要的是分发证书,加一份 App Store 类型的描述文件,这类不需要设备名单。
这里有个很多人会弄错的地方:分发证书属于团队,同一个团队、同一种分发证书只能有一张(Developer ID 那类除外),而且只有账户持有人或者管理才能建。所以组里三个人一人建一张,这个做法从一开始就走不通——第三个人建不出来,前两个里有人被顶掉,那台机器上原本能传的包,突然就传不上去了。
要装到几台指定的测试机上
描述文件里得把设备的 UDID 加进去,加完还要重新生成一份,重新装。手机换得勤的团队,名单不清理,描述文件会越滚越乱,装到第五台报错的时候,你未必想得起来是哪一步没跟上。
要收推送
能用一把 APNs Auth Key 顶下来的,就别给每个 App 都做一张推送证书。密钥在苹果后台生成,配到你的推送服务里,往后加 App 不用再走一遍证书流程。做一张证书省下的那点时间,版本一多,全还回去。
同事换了电脑,或者重装了系统
这是最容易出岔子的一种。只把 .cer 发过去,等于只给了一张写了名字的纸,私钥不在里面,签不了名。只把描述文件发过去,同理。
要给就给全:p12、导出时设的密码、描述文件、对应的 Bundle ID,最好再补一句这套东西属于哪个账号。少一样,对面就得回来再问一轮,一来一回半天就过去了。
两个别踩的坑
一个是随手点“撤销”。证书被吊销,已经上架的 App 不受影响,但你传不了新包了;已经传上去、还没提交审核的构建,可能被标成无效二进制。真要动那张证书,别挑在赶版本的当天。
另一个是把证书当成账号用。证书解决的是“这个包是谁签的”,上传和提交解决的是“你有没有资格交”。这两件事分开,账号该归谁归谁,别想着拿一张 p12 把权限问题绕过去。
配完先验一遍,再打包
我现在的习惯是打包前先验,不验心里不踏实。p12、描述文件、密码三样一起拿去测,而不是只看文件在不在、大小对不对。
初雪云的 iOS 证书在线检测就是做这一步的:选 P12,选描述文件,填上证书密码,直接连苹果服务器实时验一遍。配对关系哪里断了、有效期还剩多久,当场能看出来。这个环节放在打包之前,能省掉很多“装上了但传不上去”的来回。
如果账号是新的,或者组里第一次多人协作,找人一次性把这四样对齐也合理。初雪云的苹果证书配置是按套配好这几样,前提是你手上已经有一张状态正常的开发者账号。证书管签名,账号管资格,这两件事从一开始就是分开的。
要是你现在正卡在这儿,可以先做三件小事:把 p12 和描述文件放进同一个文件夹,改成看得出来源的名字;把密码记在一个只有你知道的地方,别写进文件名;打包前跑一遍检测。
工具在 https://www.chuxueyun.com/pages/p12certcheck ,打开就能用。