UIDevice currentDevice identifierForVendor – 可以在iPad上进行更改

我的应用程序使用UIDevice currentDevice identifierForVendor来帮助我识别设备。 最近我遇到了一个我无法理解的情况。 我的一个客户的iPad的UIDevice currentDevice identifierForVendor似乎已经改变。 这有可能吗?

UIDevice类参考说:

当用户从设备中删除所有该供应商的应用程序并随后重新安装其中一个或多个应用程序时,该值会更改。 使用Xcode安装测试版本或使用ad-hoc分发在设备上安装应用程序时,该值也会发生变化。 因此,如果您的应用程序将此属性的值存储在任何位置,则应优雅地处理标识符更改的情况。

您可以使用KeyChain存储唯一的UUID(通过您自己的方法创建或使用API )。 这可能对你有所帮助。

UIDevice currentDevice只返回有关当前正在运行的设备的信息。 在其中,您可以检查几个属性。 我假设你正在检查[UIDevice currentDevice] identifierForVendor]如果是这种情况,那么它可以改变。 如果用户删除了您的应用程序以及您(应用程序供应商)创建的所有其他应用程序,则identifierForVendor可以更改。 它可以改变的另一种情况是它是不是从App Store安装的,后来是。 例如,您为客户端提供临时构建以进行测试,然后他们从App Store安装真实应用程序。

我在搜索“几乎”一致/固定ID的唯一且固定ID时发现的另一个解决方案是使用advertisingIdentifier。 您可以检查ASIdentifierManager 。 要访问您需要的ID,请执行以下操作:

 @import AdSupport ... NSString *id = [[ASIdentifierManager sharedManager] advertisingIdentifier]; 

如果设备重置其设置或重置其广告标识符,则将重置此ID。

目前我坚持使用创建新的UUID

 NSString *UUID = [[NSUUID UUID] UUIDString]; 

并将其存储在某个地方。

5月底出现了一个错误,导致identifierForVendor在用户更新App Store中的应用程序后返回新的标识符,根据文档,它应返回相同的标识符。 请参阅这些以及这些 Apple开发者论坛post。 我也见过这个,它影响了大约20%的用户。

[UIDevice currentDevice]不是标识符。 这是一个类的实例。 我假设你的意思是identifierForVendor,它是唯一的但不是固定的。

该文档对于理解它以及提供替代方案非常有帮助。 未列出的是推送通知的设备令牌,但这是一个你不想进入的完全不同的包。