刚发现, iOS 5中 不推荐使用UIDevice uniqueIdentifier属性 ,而iOS 7及更高版本中不提供该属性 。 似乎没有其他可用的方法或属性。
我们许多现有的应用都紧密依赖此属性来唯一标识特定设备。 我们将如何处理这个问题?
特别注意事项
不要使用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-
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3158942