|
1.传统的UDID与UUID1.1通用唯一识别码UDID(UniqueDeviceIdentifier)是一串由40位16进制数组成的字符串,用以标识唯一的设备,现在想通过代码获取是不可能的了,如果你想看看你设备的UDID,可以通过iTunes来查看。缺点:苹果从iOS5开...
1.传统的UDID与UUID1.1 通用唯一识别码 UDID(Unique Device Identifier)是一串由40位16进制数组成的字符串,用以标识唯一的设备,现在想通过代码获取是不可能的了,如果你想看看你设备的UDID,可以通过iTunes来查看。 缺点:
关于获取UDID代码:
- 尽管iOS5之后已经废掉并被AppStore封杀,但可以欣赏一下:
[[UIDevice currentDevice] uniqueIdentifier];
1.2 设备唯一标识 UUID(Universally Unique IDentifier)- 是基于iOS设备上面某个单个的应用程序,只要用户没有完全删除应用程序,则这个UUID在用户使用该应用程序的时候一直保持不变。如果用户删除了这个应用程序,然后再重新安装,那么这个UUID已经发生了改变。
- 同一设备上的不同应用的UUID是互斥的,即能在改设备上标识应用。所以一些人推测,这个UUID应该是根据设备标识和应用标识生成唯一标识,再经过加密而来的(纯推测)。
- 官方推荐的方法是,每个应用内创建一个UUID来作为唯一标志,并将之存储,但是这个解决方法明显不能接受!
缺点:
- 你每次创建的UUID都是不一样的,意味着,你卸载后重新安装这个软件,生成的UUID就不一样了,无法达到我们将之作为数据分析的唯一标识符的要求。
关于获取UUID的代码:
[[UIDevice currentDevice] identifierForVendor];
不过,设备唯一标示的问题仍然没有解决:如果你删除应用然后再次安装,这个identifierForVendor的值就变了。 2. 获取设备唯一标识符的推荐新方案思路:
- 通过调用CFFUUIDCreate函数来生成机器唯一标识符UUID。但每次调用该函数返回的字符串都不一样,所以第一次调用后需把该字符串存储起来。
- 尽管CFFUUIDCreate每次获取的UUID会发生变化,最理想的是可以保存在钥匙串keychain里面,并以此作为标识用户设备的唯一标识符。
2.1 关于获取UUID的官方方案关于获取UUID,这是官方API的建议方法: - (NSString *) uniqueString { CFUUIDRef unique = CFUUIDCreate(kCFAllocatorDefault); NSString *result = [(NSString *)CFUUIDCreateString(kCFAllocatorDefault, unique) autorelease]; CFRelease(unique); return result; }
2.2 基于SSKeychain的唯一识别码方案如上获取的UUID,基于Git上的一个第三方库SSKeychain,可以将UUID保存在keychain里面,每次调用先检查钥匙串里面有没有,有则使用,没有则写进去,保证其唯一性, 参考代码: - (NSString *)getNewUniqueIdNum{ NSString *uuidStr = [SSKeychain passwordForService:@"com.test.app1" account:@"user"]; if (!uuidStr || [uuidStr isEqualToString:@""]) { CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault); uuidStr = (__bridge NSString *)CFUUIDCreateString(kCFAllocatorDefault ,uuidRef); [SSKeychain setPassword:[NSString stringWithFormat:@"%@", uuidStr] forService:@"com.test.app1"account:@"user"]; } return uuidStr; }
不同于上面调用的字符串转换(__bridge NSString *),另一种写法: - (NSString *)getNewUniqueIdNum{ NSString *identifierNumber = [SSKeychain passwordForService:@"com.test.app1"account:@"user"]; CFUUIDRef uuidRef = CFUUIDCreate(NULL); assert(uuidRef != NULL); CFStringRef uuidStrRef = CFUUIDCreateString(NULL, uuidRef); if (!identifierNumber){ [SSKeychain setPassword: [NSString stringWithFormat:@"%@", uuidStrRef] forService:@"com.test.app1"account:@"user"]; identifierNumber = [SSKeychain passwordForService:@"com.test.app1"account:@"user"]; } return identifierNumber; }
2.3 其它方案不同于如上SSKeychain,基于一个第三方库SAMKeyChains。SAMKeyChains对苹果安全框架API进行了简单封装,支持对存储在钥匙串中密码、账户进行访问,包括读取、删除和设置。SAMKeyChains使用简单,通过实例代码便可掌握。 基于SAMKeyChains方案的参考代码: + (NSString *)getDeviceId { NSString * currentDeviceUUIDStr = [SAMKeychain passwordForService:@" "account:@"uuid"]; if (currentDeviceUUIDStr == nil || [currentDeviceUUIDStr isEqualToString:@""]) { NSUUID * currentDeviceUUID =[[UIDevice currentDevice] identifierForVendor]; currentDeviceUUIDStr = [currentDeviceUUID UUIDString]; currentDeviceUUIDStr = [currentDeviceUUIDStr stringByReplacingOccurrencesOfString:@"-" withString:@""]; currentDeviceUUIDStr = [currentDeviceUUIDStr lowercaseString]; [SAMKeychain setPassword: currentDeviceUUIDStr forService:@" "account:@"uuid"]; } return currentDeviceUUIDStr; }
SAMKeyChains更多详细用法说明可以看SAMKeyChains Documentation 3 拓展阅读:官方文档3.1 涉及的对象CFUUIDRef CFUUIDRefCFStringRef CFStringRef3.2 涉及的方法CFUUIDCreate CFUUIDCreateCFUUIDCreateString CFUUIDCreateString推荐参考文献- https://developer.apple.com/documentation/corefoundation/cfuuid-rci#//apple_ref/c/func/CFUUIDCreate
- http://www.jianshu.com/p/7ad22ca88b83
- http://blog.csdn.net/sir_coding/article/details/68943033
- http://blog.163.com/ray_jun/blog/static/1670536422011102744836300/
推荐开源项目- https://github.com/DanielYK/DYDeviceInfo
- https://github.com/Mingriweiji-github/sskeychain-master
其它参考文献- http://www.cocoachina.com/bbs/read.php?tid=92404
- https://my.oschina.net/leejan97/blog/266632
- http://www.jianshu.com/p/b810d7e007ad
- http://blog.csdn.net/sakulafly/article/details/12201173
- http://www.cnblogs.com/edgarli/archive/2013/01/15/2860614.html
其它开源项目- https://github.com/gekitz/UIDevice-with-UniqueIdentifier-for-iOS-5
- https://github.com/soffes/SAMKeychain
(编辑:52刷机网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|