如何利用鑰匙串存儲(chǔ)App的賬號(hào)信息丐箩,廢話不多說(shuō)直接上代碼
.h
@interface PRZKeychainTool : NSObject
/**
* 儲(chǔ)存字符串到??鑰匙串
*
* @param sValue 對(duì)應(yīng)的Value
* @param sKey 對(duì)應(yīng)的Key
*/
+ (void)saveKeychainValue:(NSString *)sValue key:(NSString *)sKey;
/**
* 從??鑰匙串獲取字符串
*
* @param sKey 對(duì)應(yīng)的Key
*
* @return 返回儲(chǔ)存的Value
*/
+ (NSString *)readKeychainValue:(NSString *)sKey;
/**
* 從??鑰匙串刪除字符串
*
* @param sKey 對(duì)應(yīng)的Key
*/
+ (void)deleteKeychainValue:(NSString *)sKey;
@end
.m
@implementation PRZKeychainTool
+ (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];
}
// 儲(chǔ)存字符串到??鑰匙串
+ (void)saveKeychainValue:(NSString *)sValue key:(NSString *)sKey{
NSMutableDictionary * keychainQuery = [self getKeychainQuery:sKey];
SecItemDelete((__bridge_retained CFDictionaryRef)keychainQuery);
[keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:sValue] forKey:(__bridge_transfer id)kSecValueData];
SecItemAdd((__bridge_retained CFDictionaryRef)keychainQuery, NULL);
}
// 從??鑰匙串獲取字符串
+ (NSString *)readKeychainValue:(NSString *)sKey
{
NSString *ret = nil;
NSMutableDictionary *keychainQuery = [self getKeychainQuery:sKey];
[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 CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
@try {
ret = (NSString *)[NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData];
} @catch (NSException *e) {
NSLog(@"Unarchive of %@ failed: %@", sKey, e);
} @finally {
}
}
if (keyData)
CFRelease(keyData);
return ret;
}
// 從??鑰匙串刪除字符串
+ (void)deleteKeychainValue:(NSString *)sKey {
NSMutableDictionary *keychainQuery = [self getKeychainQuery:sKey];
SecItemDelete((__bridge CFDictionaryRef)keychainQuery);
}
@end
使用
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *oneTF;
@property (weak, nonatomic) IBOutlet UITextField *twoTF;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
//讀取
- (IBAction)duqu:(id)sender {
self.oneTF.text = [NSString stringWithFormat:@"讀取到用戶名:%@",[PRZKeychainTool readKeychainValue:@"uaneName"]];
self.twoTF.text = [NSString stringWithFormat:@"讀取到用密碼:%@",[PRZKeychainTool readKeychainValue:@"paw"]];
}
//保存
- (IBAction)baocun:(id)sender {
[PRZKeychainTool saveKeychainValue:self.oneTF.text key:@"uaneName"];
[PRZKeychainTool saveKeychainValue:self.twoTF.text key:@"paw"];
}
//刪除
- (IBAction)shanchu:(id)sender {
[PRZKeychainTool deleteKeychainValue:@"uaneName"];
[PRZKeychainTool deleteKeychainValue:@"paw"];
}
![Uploading 645977-20151224142516359-146623890_193643.png . . .]##一、APP對(duì)鑰匙串的訪問(wèn)權(quán)限:
(1)未對(duì)應(yīng)用APP的entitlement(授權(quán))進(jìn)行配置時(shí)恤煞,APP使用鑰匙串存儲(chǔ)時(shí)屎勘,會(huì)默認(rèn)存儲(chǔ)在自身BundleID的條目下。
645977-20151224142516359-146623890.png
本人新手呆鳥(niǎo)居扒,忘各位老司機(jī)多多鞭策概漱,使我快速成長(zhǎng)。謝啦