创建生命周期唯一ID的替代方法

时间:2013-04-13 04:41:38

标签: ios udid

我想为iphone / ipad设备创建UDID,它将保持不变,所以请告诉我是否有人有这个想法?

我搜索了谷歌和堆栈溢出,但没有得到解决方案。

还有人建议使用OpenUDID和CFUUID,但当用户删除并重新安装您的应用时,CFUUID会有所不同。但我希望每个应用程序使用相同的UDID,这将在第一次生成,并且对于每个应用程序,每个设备的生命周期应保持不变。

3 个答案:

答案 0 :(得分:8)

编辑2

由于iOS升级,并且根据新文档identifierForVendor不会保留应用重新安装的价值。我在this link看到了回答。这可能有助于一种或另一种方式。只是要注意,即使系统重置,只有UDID才会保留,因此,即使在系统重置时,这个答案也可能成为寻求终身UDID的开发人员的限制。除此之外,提到的答案似乎很有用。

另请查看summary here


identifierForVendor可从UIDevice Class Reference.

获取
  

此属性的值对于来自的应用程序是相同的   同一供应商在同一设备上运行。

[[UIDevice currentDevice] identifierForVendor].UUIDString

注意: 适用于iOS 6.0及更高版本。

编辑1 根据新版UIDevice Class Reference

  

此应用程序(或其他应用程序)中此属性的值保持不变   iOS设备上安装了来自同一供应商的应用程序。价值   当用户从中删除所有该供应商的应用程序时更改   设备,然后重新安装其中一个或多个。因此,如果   你的应用程序应该在任何地方存储此属性的值   优雅地处理标识符更改的情况。


修改

我希望您在this popular link

看到

1) MAC + CFBundleIdentifier的MD5

[[UIDevice currentDevice] uniqueDeviceIdentifier]

每个应用程序保持相同但每个应用程序不同。如果您删除并重新安装应用,则每个应用都会相同。

2)MAC

MD5
[[UIDevice currentDevice] uniqueGlobalDeviceIdentifier]

对于来自同一设备的所有应用,这将保持相同。如果您删除并重新安装应用程序,则每台设备都会相同。

编辑3

注意:iOS 7中的此解决方案不再有用,因为iOS7中不再提供uniqueIdentifier。

答案 1 :(得分:2)

重要的是要注意UDID和UUID之间的区别。

UDID“唯一设备ID”是特定于硬件的。它永远不会改变特定设备。出于这个原因,它已成为一个隐私问题,Apple正在阻止试图使用它的应用程序。因此,Apple已生成一个可选择退出的“设备ID”哈希,特别是对于广告使用。这个新的ID哈希称为IFA,可在iOS 6.0 +中使用。

UUID“通用唯一ID”不是特定于硬件的。它是用于标识设备的哈希;但不是特别绝对的价值。例如,PhoneGap根据设备属性生成UUID;这是你在做device.uuid时得到的。如果您删除该应用并重新安装,您将获得一个新的ID哈希。 UUID未被Apple阻止。

我认为最好的解决方案是使用IFA,OpenUDID作为iOS的备份< 6.0。

这是我们使用的代码。如果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];
}

答案 2 :(得分:0)

首次生成UUID(可能使用CFUUIDRef API),并将其存储在钥匙串中。