我想为iPhone/iPad设备创建一个不变的UDID,请告诉我有什么方法?
我在谷歌和Stack Overflow上搜索过,但没有找到解决方案。
一些人建议使用OpenUDID和CFUUID,但是当用户删除并重新安装应用程序时,CFUUID将会改变。但是我想要为每个应用程序使用同样的UDID,这个UDID应该在第一次生成,并且在设备的生命周期内保持不变。
编辑2
由于iOS升级和新文档的要求,identifierForVendor
在应用程序重新安装后不会保留值。我在这个链接上看到了答案。这可能会在某种程度上有所帮助。需要注意的是,即使系统重置,只有UDID才能保留,因此对于寻求终身UDID的开发人员来说,这个答案可能会有限制。除此之外,提到的答案似乎很有用。
此外,请查看这里的摘要。
identifierForVendor
可从UIDevice
类引用中获得。
此属性的值对于来自同一供应商且在同一设备上运行的应用程序相同。
[[UIDevice currentDevice] identifierForVendor].UUIDString
注意:仅适用于iOS 6.0及更高版本。
编辑1 根据UIDevice类参考文档的最新发布
在iOS设备上安装应用程序(或同一供应商的另一个应用程序)时,此属性中的值保持不变。当用户从设备中删除该供应商的所有应用程序并随后重新安装一个或多个应用程序时,该值会更改。因此,如果您的应用程序在任何地方存储此属性的值,则应优雅地处理标识符更改的情况。
编辑
我想让您查看这个流行的链接
1) MAC地址+CFBundleIdentifier的MD5值
[[UIDevice currentDevice] uniqueDeviceIdentifier]
这个值在每个应用程序中都是不变的,但对于每个应用程序来说是不同的。如果您删除并重新安装应用程序,则该值将在每个应用程序中保持不变。
2)MAC的MD5
[[UIDevice currentDevice] uniqueGlobalDeviceIdentifier]
这将对来自同一设备的所有应用程序保持不变。如果您删除并重新安装应用程序,则每个设备将保持相同。
编辑3
注意:在iOS 7中,此解决方案已不再有用,因为uniqueIdentifier从iOS 7开始不再可用。
需要注意的是UDID和UUID之间的区别。
UDID(唯一设备标识符)是硬件特定的。它永远不会改变,适用于一个特定的设备。由于这个原因,它已经成为一个隐私问题,苹果正在阻止试图使用它的应用程序。因此,苹果推出了可选择退出的“设备id”哈希,特别针对广告使用。这个新的ID哈希被称为IFA,并且在iOS 6.0及以上版本中提供。
UUID(通用唯一标识符)不是硬件特定的。它是用于识别设备的哈希值,但并不是绝对值。例如,PhoneGap基于设备属性生成UUID;这就是当你执行device.uuid时得到的内容。如果你删除应用程序并重新安装,你将得到一个新的id哈希。UUID未被苹果阻止。
我认为最好的解决方案是使用IFA,对于iOS < 6.0则使用OpenUDID作为备用。
这是我们使用的代码。如果IFA不可用,则使用OpenUDID。[你必须安装OpenUDID,在这里阅读更多:https://github.com/ylechelle/OpenUDID.]
NSString* uuid = nil;
if ([[UIDevice currentDevice] respondsToSelector:@selector(identifierForVendor)]) {
// IOS 6 new Unique Identifier implementation, IFA
uuid = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
} else {
// Before iOS6 (or if IFA disabled) you shoud use a custom implementation for uuid
// Here I use OpenUDID (you have to import it into your project)
// https://github.com/ylechelle/OpenUDID
NSString* openUDID = [OpenUDID value];
uuid = [OpenUDID value];
}
首次使用CFUUIDRef
API生成UUID,然后将其存储在密钥链中。