很多人以为签名只是给 App「盖个章」,装的时候能过系统校验就行。实际上,重签名(用新的证书重新给应用打上合法标识)会顺手改写 App 内部的一份关键文件——entitlements(权限声明,英文原意是「应得的权利」,在这里指 App 被允许使用哪些系统能力的清单)。这份清单决定了你的 App 能不能收推送、能不能读写钥匙串、能不能和自家另一个 App 共享数据。
一句话结论
签名确实会改 App 的权限,但它只能做「减法」和「对齐」,做不了「加法」。签名方没法凭空给一个 App 加上原作者根本没申请过的能力,但确实有可能因为配置不当,把原本好用的能力弄丢。所以你最该关心的不是「会不会被加权限」,而是「哪些能力签完之后会不好使」。
entitlements(权限声明)到底是什么
可以把 iOS 的安全模型理解成两道门:第一道是「你是谁」,靠证书和描述文件(provisioning profile,记录哪个证书可以签哪个应用、允许装在哪台设备上的配置文件)证明;第二道是「你能干什么」,靠 entitlements 证明。
App 里凡是涉及系统级能力的地方,都会先在 entitlements 里声明,系统才放行。常见的几项包括:
- aps-environment(推送环境):决定 App 能不能接苹果推送,以及接的是测试环境还是生产环境。
- application-identifier(应用标识):App 的唯一身份,通常由团队标识 + 包名(Bundle ID,应用的唯一身份标识)拼成。
- com.apple.developer.team-identifier(开发者团队标识):标明这个 App 归属哪个开发者账号。
- keychain-access-groups(钥匙串共享组):决定哪些 App 之间可以共享登录态、密码这类敏感数据。
- com.apple.security.application-groups(应用组):决定同一开发者的多个 App 能否共享同一块沙盒外的数据区。
- get-task-allow(调试开关):决定能不能被调试器挂载,正式分发时应当是关闭的。
签名时,到底是谁在改它
重签名工具在生成新的描述文件时,会按新证书所在的开发者账号重新生成一份 entitlements。这一步是必须的:因为团队标识变了,应用标识也得跟着变,否则系统一比对就发现对不上,直接拒绝安装。
问题就出在这里。有些权限是和原开发者账号强绑定的,换了团队标识之后就失效了,而签名工具未必知道你原来还用着这些能力。结果就是:包装上了、能打开,但某个功能悄悄失灵。
哪几类能力最容易在重签后失效
- 与账号绑定的进阶权限:比如健康数据、家庭配件控制、CarPlay(车载系统)、网络扩展、VPN(虚拟专用网络)配置等,这类权限需要开发者账号单独申请开通,换账号后新账号没开通,签出来也用不了。
- 钥匙串共享与应用组:共享组的名字里带着原团队标识,换账号后名字变了,新旧版本之间就共享不了数据。表现是:老版本存的登录态,装新版本后要求重新登录。
- 推送环境:生产环境和测试环境的推送通道是分开的,签名时环境填错,就会出现「App 能打开但一条推送都收不到」。
- 关联域名与登录类能力:比如微信登录、Apple 登录用的关联域名(Associated Domains,把网站和 App 关联起来的一项配置),换账号后需要重新确认归属,否则跳转会失败。
用户视角:会不会被加上不该有的权限
这是最常被问到的问题。从机制上看,签名方如果想给 App 加一项系统权限,前提是新证书所在的开发者账号本身开通了这项权限,而且要在 App 的代码里配合实现——单靠改 entitlements 这张清单,改不出来一个原本不存在的功能。
反过来说,这也提醒我们:判断一个 App 安不安全,看的是它要了什么权限、以及它实际做了什么,而不是它签没签名。签名只是解决了「能不能装」的问题。
送签之前,开发者该交代什么
如果你是要送签的一方,建议在交包时直接把这几项写清楚,能省掉至少一轮返工:
- App 用到了哪些需要账号权限的能力(推送、登录、钥匙串、应用组、关联域名等)。
- 包名是否固定,能不能接受重签时改写。包名被改写会影响数据继承和后续升级。
- 是否依赖与旧版本的数据共享。如果依赖,要提前确认描述文件里的共享组怎么配。
- 是否需要保留调试能力。正式分发版本一般应当关闭调试开关。
小结
entitlements(权限声明)是 App 的「能力清单」,签名必然会动它。它不会凭空造权限,但会因为账号切换而让部分能力失效。把用到的能力在送签前列清楚、在签完后逐项验收,是避免「装上了却不好使」的唯一可靠办法。
我是本期作者小思,想解决苹果企业签名、超级签名、TF签名问题?可以在微信公众号对话框找到我哦~(QQ:822404920 微信:A-mk5888)