iOS中利用KeyChain保存用戶信息的方法示例
前言
說到保存用戶名和密碼,以前有用過本地的數(shù)據(jù)庫(kù)來(lái)保存,也接觸過用userdefault來(lái)保存,后來(lái)在一個(gè)項(xiàng)目中發(fā)現(xiàn)了一個(gè)新的方法——用Keychain來(lái)保存。下面話不多說了,直接通過示例代碼來(lái)介紹吧。
方法示例
一、新建一個(gè)LYKeychainTool類,導(dǎo)入系統(tǒng)Security框架 ,LYKeychainTool.h文件實(shí)現(xiàn)如下:
// // 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 /** * 儲(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
二、LYKeychainTool.m文件實(shí)現(xiàn)如下:
//
// 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 調(diào)用
//
// 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
四、效果如下圖:

總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
iOS實(shí)現(xiàn)scrollview上拉顯示Navbar下拉隱藏功能詳解
這篇文章主要給大家介紹了利用iOS實(shí)現(xiàn)scrollview上拉顯示Navbar下拉隱藏功能的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-05-05
iOS中在APP內(nèi)加入AppStore評(píng)分功能的實(shí)現(xiàn)方法
這篇文章主要介紹了iOS中在APP內(nèi)加入AppStore評(píng)分功能的實(shí)現(xiàn)方法,文中筆者給大家整理了三種方式,大家可以根據(jù)自己的需求選擇,需要的朋友可以參考下2017-11-11
iOS利用UIBezierPath + CAAnimation實(shí)現(xiàn)路徑動(dòng)畫效果
在iOS開發(fā)中,制作動(dòng)畫效果是最讓開發(fā)者享受的環(huán)節(jié)之一,這篇文章主要給大家介紹了關(guān)于iOS利用UIBezierPath + CAAnimation實(shí)現(xiàn)路徑動(dòng)畫效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10
詳解iOS應(yīng)用中播放本地視頻以及選取本地音頻的組件用法
這里來(lái)為大家詳解iOS應(yīng)用中播放本地視頻以及選取本地音頻的組件用法,分別使用MPMoviePlayerControlle和MPMediaPickerController來(lái)實(shí)現(xiàn),兩個(gè)都是MediaPlayer.framework中的多媒體組件,所以我們放到一起來(lái)講.2016-06-06
你應(yīng)該知道的tableViewCell行高計(jì)算處理
這篇文章主要給大家介紹了關(guān)于tableViewCell行高計(jì)算的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12

