创建终身唯一ID的替代方法

10

我想为iPhone/iPad设备创建一个不变的UDID,请告诉我有什么方法?

我在谷歌和Stack Overflow上搜索过,但没有找到解决方案。

一些人建议使用OpenUDID和CFUUID,但是当用户删除并重新安装应用程序时,CFUUID将会改变。但是我想要为每个应用程序使用同样的UDID,这个UDID应该在第一次生成,并且在设备的生命周期内保持不变。


你能否为应用程序添加一个设备ID并获取其哈希码?但我不知道如何在iThings上获取固定的设备ID。 - hack_on
3个回答

8

编辑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开始不再可用。


1
identifierForVendor 的值对于特定的供应商、应用和设备将永远不会改变。 - Brijesh Vadukia
1
@Bhargavi 我尝试了相同的方法,但ID仍然保持不变。 - Pratik
1
@sunilz “如果用户更新iOS和/或安装新的iOS,那么identifierForVendor的值会改变还是保持不变?” - 我不确定,但我认为它不应该因升级的iOS版本而受影响。 - βhargavḯ
1
@Bhargavi 现在苹果已经更改了文档:“只要该应用程序(或来自同一供应商的另一个应用程序)安装在 iOS 设备上,此属性中的值将保持不变。当用户从设备中删除该供应商的所有应用程序并随后重新安装其中一个或多个应用程序时,该值会发生更改。因此,如果您的应用程序在任何地方存储此属性的值,则应优雅地处理标识符更改的情况。” - Sunil Zalavadiya
@Bhargavi 请查看以下链接:https://developer.apple.com/library/ios/documentation/uikit/reference/UIDevice_Class/Reference/UIDevice.html#//apple_ref/occ/instp/UIDevice/identifierForVendor - Sunil Zalavadiya
显示剩余9条评论

2

需要注意的是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];
}

谢谢您的回复。但我有一个问题,如果您删除应用程序并重新安装、关闭设备、更新或安装新的iOS系统,那么OpenUDID是否会保持与之前相同? - Sunil Zalavadiya
您可以在项目网站上了解更多关于OpenUDID的信息。但基本上它是一个由设备上多个应用程序共享的唯一字符串。例如,Gmail、Chrome和Dropbox使用OpenUDID(我不知道,只是为了使用应用程序名称)。第一个应用程序您下载比如说是Gmail,将设置OpenUDID字符串。第二个和第三个应用程序将读取相同的OpenUDID字符串。但是,假设您随后删除了Gmail--而不是丢失OpenUDID字符串,它将被使用它的其他应用程序维护。(要摆脱它,必须删除所有应用程序)。 - Federico

0

首次使用CFUUIDRef API生成UUID,然后将其存储在密钥链中。


如果用户更新iOS和/或安装新的iOS,那么钥匙串数据会被删除吗? - Sunil Zalavadiya
我想将创建的唯一标识存储一生,这可能吗? - Sunil Zalavadiya
@sunilz 我知道,我看了你的问题。我的答案在这里。我不知道你的问题是什么。 - user529758
是的,但我想确保钥匙串数据是否会重置。 - Sunil Zalavadiya
@sunilz 你无法百分之百地确保任何事情。但是钥匙串将会有相当高的持久性。 - user529758

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接