不推荐使用UIDevice uniqueIdentifier-现在该怎么办?

房东的猫 提交于 2020-02-28 10:18:13

刚发现, iOS 5中 不推荐使用UIDevice uniqueIdentifier属性 ,而iOS 7及更高版本中不提供属性 。 似乎没有其他可用的方法或属性。

我们许多现有的应用都紧密依赖此属性来唯一标识特定设备。 我们将如何处理这个问题?

2011-2012文档中的建议是:

特别注意事项

不要使用uniqueIdentifier属性。 要创建特定于您的应用程序的唯一标识符,您可以调用CFUUIDCreate函数来创建UUID ,然后使用NSUserDefaults类将其写入默认数据库。

但是,如果用户卸载并重新安装该应用程序,则该值将不同。


#1楼

我敢肯定,苹果公司已经使许多人为此感到烦恼。 我为iOS开发了一个簿记应用程序 ,并且具有在线服务来同步在不同设备上所做的更改。 该服务维护着所有设备以及需要传播给它们的更改的数据库。 因此,了解哪些设备是重要的。 我正在使用UIDevice uniqueIdentifier跟踪设备,对于它的价值,这是我的想法。

  • 生成UUID并存储在用户默认设置中? 没有好处,因为在用户删除应用程序时,这种情况不会持续。 如果他们稍后再安装,则联机服务不应创建新的设备记录,否则将浪费服务器上的资源,并给出两次或多次包含相同设备的设备列表。 如果用户重新安装该应用程序,将会看到列出的多个“ Bob的iPhone”。

  • 生成一个UUID并存储在钥匙串中? 这是我的计划,因为即使卸载该应用程序,它仍然存在。 但是,当将iTunes备份还原到新的iOS设备时,如果备份已加密,则将传输钥匙串。 如果旧设备和新设备都在使用中,则可能导致两个设备包含相同的设备ID。 即使设备名称相同,它们也应在联机服务中列为两个设备。

  • 生成哈希的MAC地址和捆绑包ID? 这似乎是我需要的最佳解决方案。 通过使用包ID散列,生成的设备ID不会使设备能够跨应用程序进行跟踪,而我获得了应用程序+设备组合的唯一ID。

有趣的是,Apple自己的文档指通过计算系统MAC地址的哈希值,捆绑包ID和版本来验证Mac App Store收据。 因此,根据政策,无论是否通过应用程序审核(我尚不知道),这似乎都是允许的。


#2楼

创建您自己的UUID,然后将其存储在钥匙串中。 因此,即使您的应用程序被卸载,它仍然存在。 在许多情况下,即使用户在设备之间迁移(例如,完全备份和还原到另一台设备),它也将持续存在。

就您而言,它实际上成为唯一的用户标识符 。 (甚至比设备标识符更好)。

例:

我正在定义一个用于创建UUID的自定义方法:

- (NSString *)createNewUUID 
{
    CFUUIDRef theUUID = CFUUIDCreate(NULL);
    CFStringRef string = CFUUIDCreateString(NULL, theUUID);
    CFRelease(theUUID);
    return [(NSString *)string autorelease];
}

然后,您可以在应用程序首次启动时将其存储在KEYCHAIN 。 这样,在首次启动后,我们可以简单地从钥匙串中使用它,而无需重新生成它。 使用钥匙串进行存储的主要原因是:当您将UUID设置为钥匙串时,即使用户完全卸载了该应用程序然后再次安装它,该UUID也会保留。 。 因此,这是存储它的永久方法,这意味着密钥将一直都是唯一的。

     #import "SSKeychain.h"
     #import <Security/Security.h>

在应用程序启动时,包含以下代码:

 // getting the unique key (if present ) from keychain , assuming "your app identifier" as a key
       NSString *retrieveuuid = [SSKeychain passwordForService:@"your app identifier" account:@"user"];
      if (retrieveuuid == nil) { // if this is the first time app lunching , create key for device
        NSString *uuid  = [self createNewUUID];
// save newly created key to Keychain
        [SSKeychain setPassword:uuid forService:@"your app identifier" account:@"user"];
// this is the one time process
}

sskeychain下载SSKeychain.m和.h文件,并将SSKeychain.m和.h文件拖到您的项目中,然后将“ Security.framework”添加到您的项目中。 之后使用UUID只需使用:

NSString *retrieveuuid = [SSKeychain passwordForService:@"your app identifier" account:@"user"];

#3楼

对于iOS 6,Apple建议您使用NSUUID类

现在从UIDevice文档中的消息中获得uniqueIdentifier属性:

在iOS 5.0中已弃用。 相应地,请使用此类的identifierForVendor属性或ASIdentifierManager类的advertisingIdentifier属性,或使用NSUUID类的UUID方法创建UUID并将其写入用户默认数据库。


#4楼

从iOS 6开始,我们有了符合RFC4122的 NSUUID

Apple链接: NSUUID的apple_ref


#5楼

您可以从以下代码中实现: iOS-5的UIDevice-with-UniqueIdentifier-

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!