码迷,mamicode.com
首页 > 其他好文 > 详细

利用keychain保存iphone唯一识别码idfv

时间:2015-08-09 22:40:42      阅读:515      评论:0      收藏:0      [点我收藏+]

标签:idfv   keychain   

  最近在做一个项目,项目中没有注册登录,而是使用一个唯一id来表明用户。这个唯一id我们目前基本上都是用idfv。那么,问题来了,如何让用户卸载app再次安装应用的时候还能是同一个账户。

  首先先介绍下idfv:

  idfv(identifierForVendor)是CFBundleIdentifier(反转DNS格式)的前两部分。比如某个应用的bundle id 是com.companyName.appname,那么idfv就是com.companyName。来自同一个运营商的应用运行在同一个设备上,此属性的值是相同的;不同的运营商应用运行在同一个设备上值不同,或者同一个运营商的应用运行在不同的设备上值不同。

  经测试,只要设备上有一个tencent的app,重新安装后的identifierForVendor值不变,如果tencent的app全部删除,重新安装后的identifierForVendor值改变。


肯定不能将idfv存入NSUserDefaults,因为一旦应用被卸载,那么数据将不复存在,idfv有可能就会改变。keychain不会这样。那么介绍下keychain:

我们可以把KeyChain理解为一个Dictionary,所有数据都以key-value的形式存储,可以对这个Dictionary进行add、update、get、delete这四个操作。对于每一个应用来说,KeyChain都有两个访问区,私有区和公共区。私有区是一个sandbox,本程序存储的任何数据都对其他程序不可见。而要想在将存储的内容放在公共区,需要先声明公共区的名称,官方文档管这个名称叫“keychain access group”,声明的方法是新建一个plist文件,名字随便起,内容如下: 
技术分享
“yourAppID.com.yourCompany.whatever”就是你要起的公共区名称,除了whatever字段可以随便定之外,其他的都必须如实填写。这个文件的路径要配置在 Project->build setting->Code Signing Entitlements里,否则公共区无效,配置好后,须用你正式的证书签名编译才可通过,否则xcode会弹框告诉你code signing有问题。所以,苹果限制了你只能同公司的产品共享KeyChain数据,别的公司访问不了你公司产品的KeyChain。

iOS的keychain服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式,每个ios程序都有一个独立的keychain存储。相对于NSUserDefaults、文件保存等一般方式,keychain保存更为安全,而且keychain里保存的信息不会因App被删除而丢失,所以在重装App后,keychain里的数据还能使用。
 
在应用里使用使用keyChain,我们需要导入Security.framework ,keychain的操作接口声明在头文件SecItem.h里。直接使用SecItem.h里方法操作keychain,需要写的代码较为复杂,为减轻咱们程序员的开发,我们可以使用一些已经封装好了的工具类,apple官方提出了两个工具类:KeychainItemWrapper和SFHFKeychainUtils。我用的是KeychainItemWrapper。
把KeychainItemWrapper下载下来,然后将“KeychainItemWrapper.h”和“KeychainItemWrapper.m”拷贝到我们项目,并导入Security.framework
下面是我在appDelegate.m中的代码:因为我不需要在应用间共享keychain中的内容,所以accessGroup设置为nil

- (NSString *)getIdfv

{

    NSString *str;

    KeychainItemWrapper *keychainItem = [[KeychainItemWrapperalloc] initWithIdentifier:@"UUID"accessGroup:nil];

    

    MYLog(@"%@",[keychainItem objectForKey:(__bridgeid)kSecValueData]);

    NSString *uuidStr = [keychainItemobjectForKey:(__bridgeid)kSecValueData];

    MYLog(@"%@",[[UIDevice currentDevice] identifierForVendor]);

    if ([uuidStrisKindOfClass:[NSDictionaryclass]]) { //代表里面还没有存值

        NSString *myUUIDStr = [[[UIDevicecurrentDevice] identifierForVendor]UUIDString];

        [keychainItem setObject:myUUIDStrforKey:(__bridgeid)kSecValueData];

        str = myUUIDStr;

    }

    else{

        str = [keychainItem objectForKey:(__bridgeid)kSecValueData];

    }

    MYLog(@"======%@",str);

    return str;

}

这是我对keychain保存idfv的一个总结,如果有错误,欢迎指正。共同进步,共同提高。技术分享
如果用到共享keychain中内容的时候,再来总结。技术分享



版权声明:本文为博主原创文章,未经博主允许不得转载。

利用keychain保存iphone唯一识别码idfv

标签:idfv   keychain   

原文地址:http://blog.csdn.net/oik_ios/article/details/47379441

(1)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!