宽容他人,放过自己。

钥匙串KeyChain的使用

Posted on By anchoriteFili

相关链接


使用方法


可参考相关示例UUID测试.zip

1. 首先引入Security.framework框架

752372-20160616100505479-500697386.png

2. 在使用的地方或者PrefixHeader.pch中直接引入框架头文件和三方头文件
#import <Security/Security.h>
#import "KeychainItemWrapper.h"
3. 将KeychainItemWrapper转为ARC(-fno-objc-arc)

752372-20160616103904604-1900219320.png

4. 调用相关代码
// 用到的宏
    #define UUID @"UUID"
    #define USER_DEFAULT [NSUserDefaults standardUserDefaults]

  /**
     存取钥匙串的基本逻辑:
     每次开启app,先从钥匙串中根据idetifier提取与kSecValueData(存储UUID)和kSecAttrService(可以作为判断条件),
     如果提取的kSecValueData字符串长度为0或者kSecAttrService值对应的不正确,则从设备中提取UUID并对kSecAttrService
     进行赋值,然后取出放入到NSUserDefault,用于全局使用, 如果正确,则直接存入NSUserDefault。
     
     */
    
    /** 初始化一个保存用户帐号的KeychainItemWrapper */
    KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc]
                                         initWithIdentifier:@"lvyouquan"
                                         accessGroup:nil];
    
    NSString *UUIDstr = [keychainItem objectForKey:(id)kSecValueData];
    NSString *AttrService = [keychainItem objectForKey:(id)kSecAttrService];
    
    if (!UUIDstr.length || ![AttrService isEqualToString:@"MY_APP_CREDENTIALS"]) {
        // 获取失败
        
        // 添加判断条件 这个必须赋值,否则崩溃
        [keychainItem setObject:@"MY_APP_CREDENTIALS" forKey:(id)kSecAttrService];
        
        // 将uuid保存到钥匙串中
        NSString *mobileID = [[UIDevice currentDevice].identifierForVendor UUIDString];
        [keychainItem setObject:mobileID forKey:(__bridge id)kSecValueData];
        
        // 取出uuid
        UUIDstr = [keychainItem objectForKey:(id)kSecValueData];
        
        // 将UUID保存到本地,便于获取
        [USER_DEFAULT setObject:UUIDstr forKey:UUID];
    } else {
        //获取成功
        
        // 将UUID保存到本地,便于获取
        [USER_DEFAULT setObject:UUIDstr forKey:UUID];
    }
    
    NSLog(@"UUID ======= %@",[USER_DEFAULT objectForKey:UUID]);