iOS中利用KeyChain永久保存用户信息的方法示例
方法示例
一、新建一个LYKeychainTool类,导入系统Security框架 ,LYKeychainTool.h文件实现如下
//
// LYKeychainTool.h
// keyChainTest
//
// Created by Liyu on 2017/6/2.
// Copyright © 2017年 liyu. All rights reserved.
//#import <Foundation/Foundation.h>
#import <Security/Security.h>@interface LYKeychainTool : NSObject/*** 储存字符串到钥匙串* @param sValue 对应的Value* @param sKey 对应的Key*/
+ (void)saveKeychainValue:(NSString *)sValue key:(NSString *)sKey;/*** 从钥匙串获取字符串* @param sKey 对应的Key* @return 返回储存的Value*/
+ (NSString *)readKeychainValue:(NSString *)sKey;/*** 从钥匙串删除字符串* @param sKey 对应的Key*/
+ (void)deleteKeychainValue:(NSString *)sKey;@end
二、LYKeychainTool.m文件实现如下:
//
// LYKeychainTool.m
// keyChainTest
//
// Created by Liyu on 2017/6/2.
// Copyright © 2017年 liyu. All rights reserved.
//#import "LYKeychainTool.h"@implementation LYKeychainTool+ (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)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
三、ViewController 调用
//
// ViewController.m
// keyChainTest
//
// Created by Liyu on 2017/6/2.
// Copyright © 2017年 liyu. All rights reserved.
//#import "ViewController.h"
#import "LYKeychainTool.h"@interface ViewController ()@property (weak, nonatomic) IBOutlet UITextField *userNameTextField;@property (weak, nonatomic) IBOutlet UITextField *passwordTextField;@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];}- (IBAction)saveBtn:(id)sender {[LYKeychainTool saveKeychainValue:self.userNameTextField.text key:@"userName"];[LYKeychainTool saveKeychainValue:self.passwordTextField.text key:@"password"];
}- (IBAction)readeBtn:(id)sender {self.userNameTextField.text = [NSString stringWithFormat:@"读取到用户名:%@",[LYKeychainTool readKeychainValue:@"userName"]];self.passwordTextField.text = [NSString stringWithFormat:@"读取到用户密码:%@",[LYKeychainTool readKeychainValue:@"password"]];
}- (IBAction)deleteBtn:(id)sender {[LYKeychainTool deleteKeychainValue:@"userName"];[LYKeychainTool deleteKeychainValue:@"password"];
}- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];}@end