之前我们开发中为了实现自动登录,会将用户名密码等一些重要数据作持久化保存,通常使用的方式是保存到NSUserdefault。这种做法每次卸载了app后,数据都会随之清除,而且不安全。我们可以使用系统提供的keychain来存储重要信息,使用也很简单。
首先引入头文件#import <Security/Security.h>
- 存入数据
NSDictionary *attributes = @{
(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
(__bridge id)kSecValueData : [@"123456" dataUsingEncoding:NSUTF8StringEncoding],
(__bridge id)kSecAttrAccount : @"xxx",
(__bridge id)kSecAttrService : @"userPassword",
};
OSStatus status = SecItemAdd((__bridge CFDictionaryRef)attributes, nil);
if (status == errSecSuccess) {
NSLog(@"存储成功");
}else{
NSLog(@"存储失败");
}
kSecClass 是表示存储的内容是密码还是证书还是加密的内容等主要包括
- kSecClassGenericPassword 一般的密码
- kSecClassInternetPassword 互联网密码
- kSecClassCertificate 证书
- kSecClassKey 加密的内容
- kSecClassIdentity 身份相关的
- 取出数据
NSDictionary *query = @{(__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword,
(__bridge id)kSecReturnData : @YES,
(__bridge id)kSecMatchLimit : (__bridge id)kSecMatchLimitOne,
(__bridge id)kSecAttrAccount : @"xxx",
(__bridge id)kSecAttrService : @"userPassword",
};
CFTypeRef dataTypeRef = NULL;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &dataTypeRef);
if (status == errSecSuccess) {
NSString *pwd = [[NSString alloc] initWithData:(__bridge NSData * _Nonnull)(dataTypeRef) encoding:NSUTF8StringEncoding];
NSLog(@"==result:%@", pwd);
}