还在假期中便收到了来自产品狗们的需求文档,然后在火车上的时候便看了一下他们提出的几点需求。因为是版本迭代,所以说大功能并没有变多少,只是小 修小补,但是有两个问题我还是比较关注的,一个是苹果对中国开放Apple Pay,要求可以内部充值或者付款,第二就是,要同一设备记录登陆过的手机号。第一个在上面的文章中已经部分介绍,下面主要介绍如果获得设备的唯一标识, 以及当该软件被删除重新安装以及更新后,如何保持唯一标识不变。
在非越狱的手机上获取某个硬件信息生成唯一标识,第一只能找到苹果的漏洞,第二就是调用一些私有接口,显然这两条路都比较艰难,并不可持续发展,所以网上
大部分的唯一标识都是从操作系统层面获取的,在重置手机系统的时候都会被清除,在系统升级、卸载重装、备份恢复都可以保留,现在本人尚未发现可以使用严格
意义上的唯一标识。接下来我想跟大家探讨的是如何通过“合法”的手段来尽量拿到不会轻易发生变化的“唯一标识”。
在iOS5之前,苹果提供了一个uniqueIdentifier的接口来获取设备的唯一标识,只是出于隐私保护,苹果在iOS5.0之后变废弃了,然后
大家应该都知道了,凡是用了uniqueIdentifier这个接口的,苹果直接都给拒掉了。没办法,只能另辟蹊径了。于是乎,iOS
6.0系统新增了两个用于替换uniqueIdentifier的接口,分别
是:identifierForVendor,advertisingIdentifier。在现在比较流行的友盟与talkingData统计中,标识
设备一个用的是OpenUUID+IDFA,一个用的是Keychain+IDFA。苹果公司规定说如果你的应用如果不存在广告那么你是不被允许使用
advertisingIdentifier的。所以,综上所述,最终从网上找到了解决方案:要么openudid要么Keychain+uuid。我个
人推荐第二种方案,至于为什么,看下面吧
NSString *uuid = [[NSUUID UUID] UUIDString]; NSString *uuid =
[[UIDevice currentDevice].identifierForVendor UUIDString]; 本文中部分引用:
http://www.jianshu.com/p/4a31e2a30b78
根据Keychain+UUID实现获取设备唯一标识,地址:
https://github.com/TripleStoneCheng/keychain-uuid.git
请参考上面的链接中github中的Demo,仔细阅读readme以及代码中的注释进行操作。其中在使用官方提供的Demo时,
KeychainItemWrapper *itemWrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"com.chenglei" accessGroup:nil];进
行实例化以后一定要记得将kSecAttrService或kSecAttrAccount进行赋值,否则会一直插入失败。但是经测试后发现如果用
@”UUID”这个字符串作为关键字时,kSecAttrService或kSecAttrAccount不用赋值也没问题,具体原因我也不造,等造了再
补上。
因为kSecAttrService、kSecAttrAccount这俩是作为主键存在,在存入的时候两者必须一个不为 空,kSecAttrGeneric可有可无,当你创建有kSecAttrService或kSecAttrAccount时,必须对应的创建密码。为了 使获取的数据更加精确,我建议将kSecAttrService、kSecAttrAccount两个属性以及kSecAttrGeneric都写上。
在读取的时候有以下几种情况
1. kSecAttrGeneric有值
在读取的时候,当钥匙串只利用kSecAttrGeneric这个关键字对本应用内的Keychain进行搜索时,当写入Keychain时只是设置不同
的kSecAttrService或者kSecAttrService,而设置相同的kSecAttrGeneric,则读出最近一次写入或更改的值,即
钥匙串最后一次修改同一kSecAttrGeneric所对应的值。如果不同,则取出对应的值。
2. kSecAttrGeneric没有值
当kSecAttrGeneric没有设置的时候,则查询条件可根据kSecAttrService或者kSecAttrAccount或者两者结合。
3. kSecAttrService或kSecAttrAccount有值
当kSecAttrService有值时,如果只查询kSecAttrService这个条件,则也是Keychain最近一次修改的所对应的同一kSecAttrService的值。kSecAttrAccount亦然。
所以为了使查询结果更精确,则查询条件就得更加精确,最好是三个条件都写。这样不管是增删改查都不会造成误删数据。
哦,对了,在这里说一下,如果你钥匙串中没有该值则调用查询或者删除API会返回相应的码来告诉你,该操作是错误的以及错误原因。
错误:如果出现存取错误:-34018错误,那么很可能是你的证书或者配置文件出现了问题。
转自:http://blog.csdn.net/chenglei9128/article/details/50727149
原文:http://www.cnblogs.com/superbobo/p/5235931.html