先给结论:没有次数上限。签名不是往包上盖章、盖一次少一格,它是覆盖式的——每签一次,就把上一次的签名信息整个换掉。理论上同一个 IPA(iOS 应用安装包)签一百次也照样能装。
但「能签」和「该不该这么签」是两件事。反复重签会累积三类风险,这才是真正需要关心的。
签名到底改了包里的什么
一次重签名主要动四处:把旧的 embedded.mobileprovision(内嵌描述文件,记录证书与设备授权的文件)换成新的;把 _CodeSignature(签名目录)里的哈希数据重新算一遍;把可执行文件里的 Code Directory(代码目录,记录二进制各段哈希的结构)重写;按新的授权清单更新 entitlements(权限配置)。
注意这里:业务代码、图片、配置这些资源文件本身不动。所以从功能角度看,签一百次和签一次的包是一回事;从元数据角度看,每签一次包就变一次。
三个前提
- 前提一:每次都从母包签,不要拿签过的包再签。这是最重要的一条。已经签过的包里混着上一手的描述文件和授权清单,再签一次容易把上一家的残留带进去,出问题也很难定位是从哪一手开始的。正确做法是留一份未签名的原始包当母包,每次取母包签。
- 前提二:授权清单要逐项核对,不要套通用模板。推送、钥匙串、关联域名这些配置,套模板会丢。丢一次不明显,签三五次之后差异就积重难返。
- 前提三:加壳或混淆过的包要特别说明。做过代码混淆、加过壳的包,二进制结构跟常规包不一样,重签名时的哈希计算方式也不同。这类包送签前必须提前讲清楚,否则会出现「签完了但一打开就退」的情况。
反复重签会带来的实际问题
第一是包体漂移:反复解压再压缩,包体积会小幅变化,虽然不影响功能,但会让「我这版包和上一版是不是一样」这件事说不清。第二是排查困难:出问题时分不清是哪一次签引入的。第三是版本管理混乱:设备上的老版本和新版本的签名来源不同,升级时可能出现覆盖安装失败。
建议的做法
把母包按版本号归档保存;每次重签记录日期、证书来源、授权清单版本;对外分发时统一用一个版本号,不要出现「同一个版本号对应好几个不同签名」的情况。这三条做到,重签十次和一次没什么区别。
小结
IPA 重签没有次数限制,风险不在次数,而在每一次是不是从同一个母包出发、有没有完整保留配置。管理好母包,这个问题就不存在。
我是本期作者小思,想解决苹果企业签名、超级签名、TF签名问题?可以在微信公众号对话框找到我哦~(QQ:822404920 微信:A-mk5888)