你会如何存储用户的一些敏感信息,如登录的token
使用keychain来存储,也就是钥匙串,使用keychain需要导入Security框架
自定义一个keychain的类
import <Security/Security.h>
@implementation CXDKeychain
-
(NSMutableDictionary *)getKeychainquery:(NSString *)service {
return [NSMutableDictionary dictionaryWithObjectsAndKeys:
(__bridge_transfer id)kSecClassGenericPassword,
(__bridge_transfer id)kSecClass,
service,
(__bridge_transfer id)kSecAttrService,
service,
(__bridge_transfer id)kSecAttrAccount,
(__bridge_transfer id)kSecAttrAccessibleAfterFirstUnlock,
(__bridge_transfer id)kSecAttrAccessible,
nil];
} -
(void)save:(NSString *)service data:(id)data {
//获取搜索字典
NSMutableDictionary *keychainQuery = [self getKeychainquery:service];
//添加新的删除旧的
SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);
//添加新的对象到字符串
[keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge_transfer id)kSecValueData];
//查询钥匙串
SecItemAdd((__bridge_retained CFDictionaryRef)keychainQuery, NULL);
} -
(id)load:(NSString *)service {
id ret = nil;
NSMutableDictionary *keychainQuery = [self getKeychainquery:service];
//配置搜索设置
[keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge_transfer id)kSecReturnData];
[keychainQuery setObject:(__bridge_transfer id)kSecMatchLimitOne forKey:(__bridge_transfer id)kSecMatchLimit];
CFDataRef keyData = NULL;
if (SecItemCopyMatching((__bridge_retained CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
@try {
ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge_transfer NSData *)keyData];
} @catch (NSException *exception) {
NSLog(@"Unarchive of %@ failed: %@", service, exception);
} @finally {}
}
return ret;
} -
(void)delete:(NSString *)service {
NSMutableDictionary *keychainQuery = [self getKeychainquery:service];
SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);
}
在别的类实现存储,加载,删除敏感信息方法
//用来标识这个钥匙串
static NSString const KEY_IN_KEYCHAIN = @"com.cxd.app.allinfo";
//用来标识密码
static NSString const KEY_PASSWORD = @"com.cxd.app.password";
-
(void)savePassword:(NSString *)password {
NSMutableDictionary *passwordDict = [NSMutableDictionary dictionary];
[passwordDict setObject:password forKey:KEY_PASSWORD];
[CXDKeychain save:KEY_IN_KEYCHAIN data:passwordDict];
} -
(id)readPassword {
NSMutableDictionary *passwordDict = (NSMutableDictionary *)[self load:KEY_IN_KEYCHAIN];
return [passwordDict objectForKey:KEY_PASSWORD];
} -
(void)deletePassword {
[CXDKeychain delete:KEY_IN_KEYCHAIN];
}