一句话结论:签名不是”重写应用”,它是”往包里加盖一份凭证”。业务逻辑、界面、资源这些绝大多数内容原封不动;被改的,是跟系统校验有关的几个目录和文件。理解这一点,后面遇到”为什么重签之后某个功能不好使”就有了排查方向。
一个包里大致有什么
把 IPA(iOS 安装包)用解压工具打开,通常能看到这样的结构:
- Payload(包体目录):里面放着应用主体,是整个包的核心。
- 应用主体本身:右键显示包内容可以继续往下看,里面有可执行文件、资源图片、界面文件、以及各类配置。
- Info.plist(应用配置清单):记录包名、版本、权限描述、支持的设备等关键信息。
- embedded.mobileprovision(内嵌的描述文件):记录这张凭证允许谁装、允许用到哪些能力。
- _CodeSignature(签名数据目录):存放每个文件的校验值以及整体的签名信息。
签名这一层动的就是后三项,外加把可执行文件的某些字段重写一遍。
第一处改动:换成新的描述文件
重签时,原来那张描述文件会被替换成新开发者账号颁发的那张。这张文件里写着三件关键事:
- 允许安装到哪些设备上。企业凭证不限制具体设备,临时分发(UUID)凭证会写死设备清单。
- 允许用到哪些能力,也就是 entitlements(权限声明)。推送、后台模式、钥匙串共享、应用组,都在这里列着。
- 有效期到什么时候。
如果新凭证漏掉了原开着的某一项能力,对应的功能就会静默失效——装得上、打得开,但一用到就崩或者没反应。
第二处改动:权限声明可能被收窄
这里是最容易出事的地方。某些能力属于”需要特殊授权”的类别,普通的凭证不一定带。比如:
- 推送:需要跟 App ID(应用标识)匹配的环境配置,开发环境与生产环境不能混着用。
- 应用组与钥匙串共享:用于同账号下多个应用之间共享数据,换到下家账号时该项前缀会变,共享自动失效。
- 健康数据、钱包、CarPlay(车载系统)这类:通常需要向苹果单独申请,不是勾选就能用。
所以交付时要做的不是”签完就走”,而是把这份清单交给签名方逐项对照。少了哪一项,装完之后你才会发现某个功能没了。
第三处改动:配置清单里的部分字段
Info.plist(应用配置清单)里有一部分字段是允许在重签时调整或注入的,比如渠道标识、显示名称。这也是为什么同一份包能派生出多个不同名字的分发包。
但有三个字段不建议动:
- Bundle ID(应用包名,应用的唯一标识):改了之后,老用户无法覆盖安装,会被当成另一个新应用。
- 版本号与构建号:这两个决定了能不能覆盖更新,填乱了会导致”装不上”或者”装完还是旧的”。
- 最低支持系统版本:填得太新,老机型直接被拦在门外。
签名不会碰什么
把边界也划清楚,能少很多误会。以下这些签名这一层是不动的:
- 业务代码与界面:功能逻辑不会因为你换了签名方就变化。
- 埋点与第三方 SDK(软件开发工具包):它们照常运行,除非它们依赖上面提到的某项被收窄的能力。
- 包内的服务器地址、接口配置:这些属于业务配置,跟签名无关。
换句话说,如果重签之后某个功能不对了,先怀疑”能力被收窄”和”包名变了”,几乎不会是”代码被改了”。
交付时该怎么核
给一个简单的三步检查:
-
把原包的权限清单导出一份,交给处理方,要求重签后逐项一致。
-
拿到成品包后,确认包名、版本号、构建号与原包一致。
-
真机装一遍,重点测推送、登录、支付、数据共享这四个最依赖权限的环节。
小结
签名改的是凭证层,不是业务层。把”会被替换的描述文件””可能被收窄的权限声明””不建议动的三个字段”这三件事记住,绝大多数重签之后的功能异常,都能在交付前被拦下来。
我是本期作者小思,想解决苹果企业签名、超级签名、TF签名问题?可以在微信公众号对话框找到我哦~(QQ:822404920 微信:A-mk5888)