一句话结论
一个看起来是单个文件的安装包,内部可能是「主包套着子包」的结构。签名必须一层一层全部覆盖到,只要有一个子包没签上,结果就是装不上、装上闪退,或者主功能正常但子功能完全用不了。
哪些包是嵌套结构
最常见的是带 Apple Watch(苹果智能手表)伴侣应用的 App。手表端的应用并不是独立分发的,它是作为一个子包被塞进手机端的主包里,用户安装手机 App 的时候一起带进去,再同步到手表上。
除此之外,以下几类也都属于嵌套结构,只是平时不太被注意到。
- Extension(扩展插件),比如通知栏小组件、分享菜单扩展、自定义键盘。
- 内嵌的动态库和第三方框架。
- 某些 App 自带的小游戏或独立模块。
签名是怎么一层层走下去的
签名的顺序是从里到外:先把最里面的子包签好,再签包住它的那一层,最后签最外面的主包。外层在签的时候,会把内层已经签好的结果一并纳入校验范围。
这个顺序不能反。如果先签了外层再回头补内层,外层的校验结果就和内层的实际内容对不上了,系统在装的时候一验就会发现不符。
常见失败表现
- 直接装不上。提示安装失败,多半是某个子包完全没签上。
- 能装上,一打开就退。通常是子包签了,但签名身份和主包不一致——主包用这个证书,子包用了另一个。
- 主功能正常,子功能失效。比如手机端能用,手表端怎么同步都出不来,或者小组件一直加载不出来。这种最容易漏判,因为看起来「App 是好的」。
送签之前能自己查什么
- 先确认包里到底有没有子包。把包解开看目录结构,比看文件名猜要可靠得多。
- 如果研发是自己出包的,让他在本地先用真机完整装一遍、把子功能也点一遍,别只测主页能不能开。
- 送来签名时要主动说明「这个包带 Watch 端/带插件」,这一句提示能省掉一轮来回。
- 重签之后,同样要把子功能走一遍,不要只看主包装上了就算完成。
修改子包之后一定要重新签
有一点常被忽略:只要子包内容有任何变动,哪怕只换了一张图,外层签过的结果就作废了,必须整包重新签。有人图省事只把主包重新签一次,装上去主页面看着正常,一进子功能就崩,就是这个原因。
小结
嵌套包不是什么特殊情况,带手表端、带插件的 App 相当普遍。出问题的时候别只盯着主包,把子功能也当成一个独立的部分去验,定位会快很多。
我是本期作者小思,想解决苹果企业签名、超级签名、TF签名问题?可以在微信公众号对话框找到我哦~(QQ:822404920 微信:A-mk5888)
Copyright ©2020—2026 All Rights Reserved.