换签名商重装之后,用户最常见的抱怨是「又要重新登录」。但也有人反馈说,重装完打开还是原来的账号,什么都没丢。这两种结果看起来矛盾,其实是同一套机制在不同条件下的表现,而这个条件是可以提前判断的。
一句话结论
账号密码这类敏感数据,很多 App 存在钥匙串(Keychain,苹果系统提供的加密存储服务,专门放密码、令牌、证书)里,而不是存在 App 自己的沙盒(Sandbox,每个应用独立的存储空间,卸载时会一起清掉)里。钥匙串由系统统一管理,卸载 App 不会自动清掉它。能不能取回来,取决于新包的包名和团队标识有没有变。
为什么卸载了数据还在
iOS(苹果手机系统)的安全设计里,钥匙串是一个独立于应用沙盒的存储区域。可以把沙盒理解成 App 自己的抽屉,卸载的时抽屉整个被搬走;钥匙串则更像是楼下的信箱,归系统管,App 只是拿着一把钥匙去开。
这个设计本来是为了体验:用户升级、重装 App 之后不用再输一遍密码。但它同时意味着,只要新装的包「认得出」旧的那把钥匙,登录态就能保住。
决定因素:包名和团队标识
能不能取回旧的钥匙串数据,主要看两个东西有没有保持一致:
- Bundle ID(应用包名):一个 App 在全球范围内的唯一标识,写法类似 com.company.app。包名变了,系统在钥匙串层面就认为是另一个应用,旧数据取不到。
- Team ID(团队标识):开发者账号对应的十位字符串,签名时会被写进应用。同一个包名,如果前后由不同的开发者账号签名,Team ID 不一样,钥匙串的访问组(Access Group,决定哪些应用能共享这段数据)前缀就变了,同样读不出来。
这就是为什么「换签名商」这个动作有风险:新的签名商用的几乎一定是另一个开发者账号,Team ID 必然不同。如果只是同一家签名商重新签一遍,Team ID 没变,登录态大概率还在。
三种典型结果
- 同一家重签:包名和团队标识都没变,钥匙串数据可读,用户打开还是已登录状态。
- 换签名商、包名不变:团队标识变了,钥匙串读不出来。App 不会崩溃,但会退回未登录,用户需要重新输账号密码。
- 换签名商且包名也改了:等于换了一个全新应用。不仅登录态没了,旧的本地数据、缓存、设置也一并留在原地,新旧两个包可能同时存在于桌面上。
App 自己的设计也有影响
不是所有 App 都把登录态放在钥匙串里。有些开发者选择存在沙盒的偏好设置里,这类数据卸载即清空,无论怎么签都保不住;还有些 App 的登录令牌本身就设了有效期,重装后需要联网重新换取,体验和「丢了」差不多。
所以对使用者来说,更稳的判断方式是看历史行为:同一个 App 过去重装要不要重新登录,换签名商之后大概率也是同样的结果,不会因为换了家供应商就突然变好。
能提前做点什么
- 换签名商之前先确认包名会不会变。这是唯一一个你能提前问到、且影响最大的变量。
- 提前告知用户可能需要重新登录。掉签重签本来就够折腾,如果打开还要重新输入账号,提前说一句能少掉一半投诉。
- 重要数据不要只存在本地。聊天记录、游戏存档这类数据如果存在沙盒里,重装必丢,跟钥匙串无关。有条件的应该做云端同步。
小结
钥匙串是一个「系统级存储、卸载不清」的机制,它解释了为什么重装的体验时好时坏。决定因素是包名和团队标识,其中团队标识由签名用的开发者账号决定——这也是换签名商时无法回避的一个连带影响。理解了这层,就能在换商之前把话说在前面,而不是等用户来问。
我是本期作者小思,想解决苹果企业签名、超级签名、TF签名问题?可以在微信公众号对话框找到我哦~(QQ:822404920 微信:A-mk5888)