iphone - UIDevice uniqueIdentifier Deprecated- 该怎么做?

  显示原文与译文双语对照的内容

在网路作业系统 5和上面,它刚刚来到光照会 UIDevice唯一标志符属性已经被否决. 没有可以供选择的方法或者属性似乎可用或者即将出现。

我们现有的许多应用都依赖这个属性来唯一地识别特定的设备。 任何人都能建议我们如何处理这个问题?

文档的建议是。is 。

特殊注意事项

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

但是,如果用户卸载和re-installs应用,这个值将不一样。

时间:

创建的UUID通过 CFUUIDCreate 是唯一的如果用户卸装和re-installs该应用: 每次你都会得到一个新的。

但是你可能希望它不是独一无二的 。 当用户卸载和re-installs应用时,它应该保持不变。 这需要付出一点努力,因为最可靠的per-device-identifier似乎是MAC地址。 你可以查询 MAC 并使用它作为 UUID 。

编辑: 一个需要经常查询的MAC相同的接口,当然。 我猜最好的赌注是 en0 。 MAC总是存在的,即使接口没有 ip/。

编辑 2: 前面我们指出他人,首选的解决方案由于网路作业系统 6是 - [UIDevice identifierForVendor] 。 在大多数情况下,你应该能够使用它作为一个drop-in替换到旧 -[UIDevice uniqueIdentifier] ( 但是当应用程序首次启动时创建的UUID是苹果想让你使用的) 。

在批注 noise, 编辑段主要讲述 3: 所以这不得到 lost: 使用苹果机的, 不使用苹果电脑比如 UUID,创建一个 hash. 这个散列每次都会产生同样的结果,即使是在重新安装和应用( 如果哈希是以相同方式进行的) 。 iOS上 <identifier.外流,是当今任何更多的,只是如果你需要一个"稳定"( 2013 ) 这不是必要的设备

于身份证相关 scheme, 中编辑 4: iOS 7,苹果现在在 MAC为苹果机中总是返回一个固定的值在查询的专门thwart唱臂搁架 所以你现在真的应该使用 - [UIDevice identifierForVendor] 或者创建一个 per-install UUID 。

你可以使用苹果 UDID的替代品。 个家伙gekitz写了范畴 UIDevice 这将生成某种 UDID 上根据设备mac-address和绑定包的标识符。

你可以在 github中找到代码

看看这个

我们可以使用钥匙串而不是由 CFUUIDCreateNSUserDefaults 类,来存储 UUID 创建。

通过这种方式,我们可以避免 UUID 娱乐的重新安装,并获得相同的UUID,即使用户卸载和重新安装也同样的。

UUID 将在用户重置设备时重新创建。

我用 SFHFKeychainUtils 方法尝试了这个方法,它的效果很像。

于你的app, UUID的相关都是惟一的,你必须把它储存在钥匙串中,这样,即使是在你的应用从设备上删除,下一次,你会得到同样 下面是一个我正在做的例子: 我正在定义一个用于创建 UUID的自定义方法:


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

你可以在第一次启动应用程序时将它的存储在 KEYCHAIN 中。 所以在第一次启动之后,我们可以简单地从钥匙串使用它,无需重新生成它。 使用钥匙串存储的主要原因是: 当你将 UUID 设置为钥匙串时,即使用户完全卸载该应用程序,然后再次安装它,它也将保持不变。 这是存储它的永久方式,这意味着密钥将一直唯一。


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

在启动包括以下 code, applictaion :


//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 文件拖到项目中并添加"安全性。框架"到项目中。 要使用 UUID,只需使用:


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

也许你可以使用:


[UIDevice currentDevice].identifierForVendor.UUIDString

苹果的文档描述identifierForVender如下:

对于同一设备上运行的同一供应商,这里属性的值相同。 对于来自不同供应商的应用程序和不同设备上的应用返回不同的值,而不考虑供应商。

可能有帮助:在下面的代码中,除了你的erase(Format) 之外,它总是唯一的。


UIDevice *myDevice=[UIDevice currentDevice];
NSString *UUID = [[myDevice identifierForVendor] UUIDString];

对于 iOS 6来说,苹果推荐你使用 NSUUID类

UIDevice web 文档中的消息到 uniqueIdentifier 属性:

不推荐在网路作业系统的advertisingIdentifier 5.0.使用此类的identifierForVendor属性或者属性ASIdentifierManager类的树,如适当的情况下,也可以使用 UUID NSUUID类的方法来创建一个 UUID,并将它的写入用户默认数据库。

...