keychain用法: 這里不講底層,只講2個(gè)框架的使用 STKeychain(第三方開(kāi)源) 和 KeychainItemWrapper(蘋(píng)果官方demo)
1.KeychainItemWrapper 這個(gè)是蘋(píng)果的一個(gè)官方demo,里面使用大概如下
/** 初始化一個(gè)保存用戶(hù)帳號(hào)的KeychainItemWrapper */
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"Account Number" accessGroup:@"YOUR_APP_ID_HERE.com.yourcompany.AppIdentifier"];
// 一般來(lái)說(shuō) 增刪改查, 增用保存,刪除這邊是reset,改則是在增加一次用相同的key,查則是用objectForkey
//保存帳號(hào)
[wrapper setObject:@"<帳號(hào)>" forKey:(id)kSecAttrAccount];
//保存密碼
[wrapper setObject:@"<帳號(hào)密碼>" forKey:(id)kSecValueData];
//從keychain里取出帳號(hào)密碼
NSString *password = [wrapper objectForKey:(id)kSecValueData];
//清空設(shè)置
[wrapper resetKeychainItem];
這里免得account一般是你的用戶(hù)獨(dú)有,如用戶(hù)id,用戶(hù)名等, 而其他的key一般用的都是蘋(píng)果官方提供
kSecAttrAccessGroup - CFStringRef
kSecAttrCreationDate - CFDateRef
kSecAttrModificationDate - CFDateRef
kSecAttrDescription - CFStringRef
kSecAttrComment - CFStringRef
kSecAttrCreator - CFNumberRef
kSecAttrType - CFNumberRef
kSecAttrLabel - CFStringRef
kSecAttrIsInvisible - CFBooleanRef
kSecAttrIsNegative - CFBooleanRef
kSecAttrAccount - CFStringRef
kSecAttrService - CFStringRef
kSecAttrGeneric - CFDataRef
2,STKeychain 這個(gè)在github和許多工具類(lèi)放在一起,看起來(lái)很有效的樣子
使用這個(gè)框架則是只能用來(lái)存儲(chǔ)用戶(hù)名+密碼的組合,而蘋(píng)果官方demo還是可以一定程度自定義的
這邊提供了三個(gè)方法進(jìn)行 增(改)刪查
//獲取
- (IBAction)getKeyChain:(id)sender {
NSError *error;
NSString *str = [STKeychain getPasswordForUsername:@"zhangsan" andServiceName:@"com.rac.keyChain" error:&error];
if(error || !str){
NSLog(@"?從Keychain里獲取密碼出錯(cuò):%@", error);
} else{
NSLog(@"?從Keychain里獲取密碼成功!密碼為%@",str);
}
// 這里一個(gè)label用來(lái)看獲取的密碼
self.label.text = str;
}
//存儲(chǔ)
- (IBAction)storeKeyChain:(id)sender {
NSError *error;
BOOL saved = [STKeychain storeUsername:@"zhangsan" andPassword:@"123456" forServiceName:@"com.rac.keyChain" updateExisting:error error:&error];
if (!saved) {
NSLog(@"?Keychain保存密碼時(shí)出錯(cuò):%@", error);
}else{
NSLog(@"?Keychain保存密碼成功!");
}
}
//刪除
- (IBAction)deleteKeyChain:(id)sender {
NSError *error;
BOOL isDeleted;
isDeleted = [STKeychain deleteItemForUsername:@"zhangsan" andServiceName:@"com.rac.keyChain" error:&error];
if (!isDeleted) {
NSLog(@"?Keychain刪除");
NSLog(@"%@",error);
}else{
NSLog(@"?Keychain刪除成功");
}
}
其實(shí)如果你只需要存儲(chǔ)用戶(hù)名和密碼, 這個(gè)第三方的框架是能夠滿(mǎn)足你的需求,而且使用起來(lái)也非常方便, 另外,這些都是調(diào)用了蘋(píng)果的一些方法,類(lèi)似
SecItemDelete
SecItemCopyMatching
SecItemUpdate
SecItemAdd
使用這些方法,根據(jù)我們項(xiàng)目的需求,也可以快速便捷的自定義一些我們自己需要使用的keychain工具類(lèi)