「这个包签不了」「签完能装,但推送收不到、小组件不显示」——这类问题里,有相当一部分出在包的内部结构,而不是证书本身。一个 ipa(iOS 应用的安装包格式)并不是一个单独的文件,它更像一个文件夹,里面除了主程序,还可能装着好几样需要单独处理的东西。
一句话结论
主程序要签名,主程序之外的扩展插件、动态库、内嵌的手表应用同样要签名,而且必须和主程序用同一套证书与描述文件。漏签其中任何一样,结果要么是安装直接失败,要么是能装上但部分功能悄悄失效。
一个 ipa 里可能装着什么
解压一个 ipa,常见的结构里除了主程序,会有这些:
- Extension(扩展插件):后缀是 .appex(应用扩展包),比如通知服务扩展(负责推送到达时先处理一下内容)、小组件(Widget,桌面上的小卡片)、分享扩展、键盘扩展等。
- Framework(动态库):可复用的代码库,第三方统计、支付、推送的 SDK(Software Development Kit,软件开发工具包)经常以这种形式打进包里。
- Watch App(手表应用):如果应用支持 Apple Watch(苹果手表),包里会带一个手表端的应用。
- 资源文件:图片、字体、配置,这些不参与签名校验,但影响包体积。
为什么漏签会导致失败
苹果的签名校验是逐层做的。安装时系统会检查包内每一个需要执行的代码单元:主程序签了,扩展没签,那这个包在校验环节就不通过,直接拒绝安装。这是「签完装不上」最常见的一类原因,而且报错信息往往很含糊,看不出来是扩展出了问题。
另一种情况更隐蔽:某些系统版本对扩展的校验相对宽松,包能装上、主功能也正常,但推送的富媒体内容不显示、桌面小组件加不上去、分享菜单里找不到你的应用。用户只会觉得「这个 App 有问题」,很难联想到是签名环节漏了东西。
动态库的签名同样要重做
Framework(动态库)也一样。原来的包是用开发者自己的证书签的,重签的时这些动态库必须全部用新的证书重新签一遍,只签主程序是不够的。第三方 SDK 多、动态库嵌套层数多的包,重签耗时更长,出问题的概率也更高。
有些动态库本身还带有资源包(Bundle),资源虽然不参与代码签名,但如果重签过程中被漏掉或改名,运行时加载资源就会失败,表现为某些界面白屏、图标不显示。
送签之前该向签名商说明什么
- 包里有没有扩展插件。有推送扩展、小组件扩展的要提前说明,让对方按完整结构处理。
- 有没有手表端应用。Watch App(手表应用)需要单独的描述文件,默认流程容易漏掉。
- 用了哪些第三方 SDK。统计、支付、推送类的 SDK 常常带动态库,有些还对权限声明有额外要求。
- 这个包原计划是上架还是内部分发。不同用途的包在权限配置上有差别,混用容易出问题。
收到签好的包之后怎么验证
不要只看「能不能装」。装上之后应该按功能清单走一遍:推送能不能收到、小组件能不能加上、分享和键盘扩展在不在、手表端能不能同步。这些地方才是扩展签名是否完整的试金石。发现某一项失效,先怀疑重签时漏了这个扩展,而不是急着改代码。
小结
ipa 是一个多部件的包裹,签名是对每一个部件分别做的。主程序签好了不代表整包签好了。送签时把包的结构说清楚,收到包后按功能逐项验证,能挡掉大部分「能装但不好用」的问题。这部分的沟通成本,比事后返工要低得多。
我是本期作者小思,想解决苹果企业签名、超级签名、TF签名问题?可以在微信公众号对话框找到我哦~(QQ:822404920 微信:A-mk5888)