(转)iOS获取设备唯一标识码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(转)iOS获取设备唯一标识码相关的知识,希望对你有一定的参考价值。
文/举个栗子wow(简书作者)
原文链接:http://www.jianshu.com/p/65c92cd1c0ee
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
“刷优惠券”就是刷美团或者大众这些做首单优惠的App的优惠券,它们为“首单”创造了几个制约因素,其中一个就是设备的唯一性——参加过的不能再参加,这就要获取的设备的唯一标识。这项技能一度使我在大学里吃牛排看电影不要钱。
有点跑题,回到正题上。我查阅了一些资料,了解了一下ios下是如何做到“设备标识的唯一性的”。不得不说iOS在用户隐私政策和权限上做的非常好,一个App能获得的权限(没越狱的情况下)是非常有限的,之前的很多方法比如UDID都被弃用禁止了。
那么就说现在还能用的,现在常用的是用UUID + keychain
结合来实现这个需求。
UUID是Universally Unique Identifier的缩写,中文意思是通用唯一识别码。它是让分布式系统中的所有元素,都能有唯一的辨识资讯,而不需要透过中央控制端来做辨识资讯的指定。这样,每个人都可以建立不与其它人冲突的 UUID。在此情况下,就不需考虑数据库建立时的名称重复问题。苹果公司建议使用UUID为应用生成唯一标识字符串。
首先我们要获取一个UUID,方法如下:
- (NSString*)uuid { CFUUIDRef uuid = CFUUIDCreate( nil ); CFStringRef uuidString = CFUUIDCreateString( nil, uuid ); NSString * result = (NSString *)CFBridgingRelease(CFStringCreateCopy( NULL, uuidString)); CFRelease(uuid); CFRelease(uuidString); return result; }
现在我们获取到了一个UUID,虽然这个标识是唯一的,但是这样还是无法保证每一次的唯一性,因为当你每次调用这个方法或者把应用卸载了,UUID会重新生成一个不同的。这个时候keychain就起到了作用。所以整个逻辑是这样的:先从keychain取UUID,如果能取到,就用这个比对,如果取不到就重新生成一个保存起来。
keychain独立在App之外,是和系统统一等级的,所以你不用担心它挂掉。
keychain是苹果公司Mac OS中的密码管理系统。它在Mac OS 8.6中被导入,并且包括在了所有后续的Mac OS版本中,包括Mac OS X。一个钥匙串可以包含多种类型的数据:密码(包括网站,FTP服务器,SSH帐户,网络共享,无线网络,群组软件,加密磁盘镜像等),私钥,电子证书和加密笔记等。iOS端同样有个keychain帮助我们管理这些敏感信息。
使用过keychain保存过账号密码的童鞋应该对这个工具非常了解,在这里不做过多解释。使用keychain需要导入Security.framework
和KeychainItemWrapper.h/.m
,KeychainItemWrapper.h/.m
搜一下可以下载下来,拖入工程中。保存UUID代码如下:
- (void)saveUuidWithKeyChain { KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"UUID" accessGroup:@"com.QiuYunxiang.www"]; NSString *strUUID = [keychainItem objectForKey:(id)kSecValueData]; if (strUUID == nil || [strUUID isEqualToString:@""]) { [keychainItem setObject:[self uuid] forKey:(id)kSecValueData]; } }
注:这个方法中accessGroup:
这个参数如果一些App设置相同的话,是可以共享的。
从keychain获取UUID的方法如下:
- (NSString *)getKeychain { KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"UUID" accessGroup:@"com.QiuYunxiang.com"]; NSString *strUUID = [keychainItem objectForKey:(id)kSecValueData]; return strUUID; }
至此,基本上唯一标识的几个方法算是写完了,大家可以测试一下,卸载应用再重新装,从keychain读取的UUID还是和之前一样。
但这里有个不确定因素,就是手机系统恢复出厂设置或者抹掉所有数据的话,这个方法也可能不起作用了,因为它是依靠钥匙串在生存,钥匙串挂掉的话它也就失效了。
以上是关于(转)iOS获取设备唯一标识码的主要内容,如果未能解决你的问题,请参考以下文章