在iOS开发过程中,我们经常需要保存用户名和密码等敏感信息,于此同时呢 iOS的安全机制给了我们一个保存敏感信息的途径 就是钥匙串 我们可以将用户名密码保存在系统的钥匙串中 而且利用这种方式保存的用户名密码相对来说时间也较长也比较安全 钥匙串里面的内容不会因为APP的安装和卸载而丢失里面的数据 即使重装APP钥匙串里面的信息依然可以随时取用 大大方便了用户
使用之前我们需要导入Security.framework框架 和苹果官方给开发者封装好的一个工具类KeychainItemWrapper 下载地址:GenericKeychain
同时需要注意KeychainItemWrapper是不兼容ARC的 如果是ARC工程的话 需要在你编译的target -->build phases -->Compiled sources 中双击KeychainItemWrapper.m文件写上-fno-objc-arc 否则编译器会报错
KeychainItemWrapper中的方法如下
//初始化对象需要标识符和应用程序的 Bundle indentifier
- (id)initWithIdentifier: (NSString *)identifier accessGroup:(NSString *) accessGroup;
//添加或者设置内容
- (void)setObject:(id)inObject forKey:(id)key;
//取出内容
- (id)objectForKey:(id)key;
// 清空数据.
- (void)resetKeychainItem;
上面方法的实际用法其实很简单 无非就是init创建钥匙串对象 然后设置保存用户名和密码 只不过需要注意的是
- (void)setObject:(id)inObject forKey:(id)key;
这个方法的key是Security里面自定义的CFTypeRef参数 并且需要兼容ARC 所以需要强制转换成(__bridge id)类型否则运行的时候会提示Couldn't update the Keychain Item.(无法写入钥匙串)错误
KeychainItemWrapper中的方法如下
// 新建对象并且初始化 钥匙串标识符和应用程序标识符
KeychainItemWrapper * keyChain = [[KeychainItemWrapper alloc] initWithIdentifier:@"userName" accessGroup:@"com.csdn.Keychain"];
// 添加或设置用户名密码
[keyChain setObject:@"用户名" forKey:(__bridge id)kSecAttrAccount];
[keyChain setObject:@"用户密码" forKey:(__bridge id)kSecValueData];
// 取出用户名和密码
NSString * username = [keyChain objectForKey:(__bridge id)kSecAttrAccount];
NSString * password = [keyChain objectForKey:(__bridge id)kSecValueData];
// 清空所keyChain中所有内容
[keyChain resetKeychainItem];
NSLog(@"userName = %@ passWord = %@",username,password);