技术问询:App更新时identifierForVendor是否变更?相关历史bug是否已修复?
首先直接给结论:正常情况下,从App Store更新App时identifierForVendor不应该发生变更,但你提到的那个历史bug确实存在过。
先说说正常逻辑
identifierForVendor的生成规则是基于你的开发者Team ID和App的Bundle ID组合计算的——只要这两个核心信息不变,不管你是更新App、还是在同一设备上重装同一开发者的App,这个标识都应该保持一致。它的设计初衷就是用来标识同一开发者旗下App在同一设备上的用户群体。
你提到的rdar://22677034 bug
这个bug确实是苹果iOS系统曾经存在的问题,主要出现在iOS 9到iOS 10早期版本中。当时有不少开发者反馈,通过App Store更新App后,UIDevice.current.identifierForVendor返回的值突然变了,导致依赖这个标识做用户关联、数据绑定的功能出现异常。苹果当时也承认了这个计算逻辑上的bug。
修复状态
好消息是,这个bug在iOS 11及之后的系统版本中已经被苹果彻底修复了。现在在主流的iOS版本(iOS 11+)上,App Store更新App的场景下,identifierForVendor不会再出现无故变更的情况。
额外提醒
如果你的App需要依赖稳定的设备/用户标识,还需要注意这些场景会导致identifierForVendor变更:
- 卸载了同一开发者旗下的所有App,然后重新安装任意一个
- 更换了App的开发者Team ID(比如转售App、更换账号)
- 使用TestFlight安装的测试包和正式包之间切换(不过现在这个情况也优化了)
另外,如果你需要更稳定的跨App或跨重装的标识,苹果现在更推荐使用ASIdentifierManager的advertisingIdentifier(注意要遵循ATT框架的合规要求),或者自己生成UUID并存储在UserDefaults、Keychain里(后者更安全,不会因为卸载丢失)。
内容的提问来源于stack exchange,提问作者Geri Borbás

