最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

iOS中利用KeyChain保存用戶信息的方法示例

 更新時間:2017年06月28日 11:38:50   作者:Hello0307  
有用戶就用用戶名和密碼,而現(xiàn)在的應(yīng)用都少不了一個保存用戶名和密碼用于自動登錄的功能,本文介紹使用iOS自帶的Keychain方法保存用戶名和密碼信息的相關(guān)資料,需要的朋友可以參考參考借鑒,下面來一起看看吧。

前言

說到保存用戶名和密碼,以前有用過本地的數(shù)據(jù)庫來保存,也接觸過用userdefault來保存,后來在一個項目中發(fā)現(xiàn)了一個新的方法——用Keychain來保存。下面話不多說了,直接通過示例代碼來介紹吧。

方法示例

一、新建一個LYKeychainTool類,導(dǎo)入系統(tǒng)Security框架 ,LYKeychainTool.h文件實現(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

/**
 * 儲存字符串到鑰匙串
 * @param sValue 對應(yīng)的Value
 * @param sKey 對應(yīng)的Key
 */
+ (void)saveKeychainValue:(NSString *)sValue key:(NSString *)sKey;

/**
 * 從鑰匙串獲取字符串
 * @param sKey 對應(yīng)的Key
 * @return 返回儲存的Value
 */
+ (NSString *)readKeychainValue:(NSString *)sKey;

/**
 * 從鑰匙串刪除字符串
 * @param sKey 對應(yīng)的Key
 */
+ (void)deleteKeychainValue:(NSString *)sKey;

@end

二、LYKeychainTool.m文件實現(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é)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • iOS實現(xiàn)scrollview上拉顯示Navbar下拉隱藏功能詳解

    iOS實現(xiàn)scrollview上拉顯示Navbar下拉隱藏功能詳解

    這篇文章主要給大家介紹了利用iOS實現(xiàn)scrollview上拉顯示Navbar下拉隱藏功能的相關(guān)資料,文中介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-05-05
  • iOS中多線程的入門使用教程(Swift)

    iOS中多線程的入門使用教程(Swift)

    這篇文章主要給大家介紹了關(guān)于iOS中多線程入門使用的相關(guān)資料,一個進(jìn)程中可以開啟多條線程,每條線程可以并行執(zhí)行不同的任務(wù),本文通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-11-11
  • iOS中在APP內(nèi)加入AppStore評分功能的實現(xiàn)方法

    iOS中在APP內(nèi)加入AppStore評分功能的實現(xiàn)方法

    這篇文章主要介紹了iOS中在APP內(nèi)加入AppStore評分功能的實現(xiàn)方法,文中筆者給大家整理了三種方式,大家可以根據(jù)自己的需求選擇,需要的朋友可以參考下
    2017-11-11
  • 針對iOS10新增Api的詳細(xì)研究

    針對iOS10新增Api的詳細(xì)研究

    這篇文章主要針對iOS10新增Api進(jìn)行詳細(xì)研究,基于Api層面,著重看一些具體用法所做的筆記,感興趣的小伙伴們可以參考一下
    2016-09-09
  • iOS利用UIBezierPath + CAAnimation實現(xiàn)路徑動畫效果

    iOS利用UIBezierPath + CAAnimation實現(xiàn)路徑動畫效果

    在iOS開發(fā)中,制作動畫效果是最讓開發(fā)者享受的環(huán)節(jié)之一,這篇文章主要給大家介紹了關(guān)于iOS利用UIBezierPath + CAAnimation實現(xiàn)路徑動畫效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • iOS自定義身份證鍵盤

    iOS自定義身份證鍵盤

    這篇文章主要為大家詳細(xì)介紹了iOS自定義身份證鍵盤,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 詳解iOS應(yīng)用中播放本地視頻以及選取本地音頻的組件用法

    詳解iOS應(yīng)用中播放本地視頻以及選取本地音頻的組件用法

    這里來為大家詳解iOS應(yīng)用中播放本地視頻以及選取本地音頻的組件用法,分別使用MPMoviePlayerControlle和MPMediaPickerController來實現(xiàn),兩個都是MediaPlayer.framework中的多媒體組件,所以我們放到一起來講.
    2016-06-06
  • IOS 開發(fā)之觸摸事件詳細(xì)介紹

    IOS 開發(fā)之觸摸事件詳細(xì)介紹

    這篇文章主要介紹了IOS 開發(fā)之觸摸事件詳系介紹的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 詳解IOS中GCD的使用

    詳解IOS中GCD的使用

    GCD是iOS的一種底層多線程機制,本文給大家詳細(xì)介紹IOS中GCD的使用,需要的朋友參考下吧
    2016-02-02
  • 你應(yīng)該知道的tableViewCell行高計算處理

    你應(yīng)該知道的tableViewCell行高計算處理

    這篇文章主要給大家介紹了關(guān)于tableViewCell行高計算的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12

最新評論

大同市| 建德市| 滦平县| 昌平区| 北流市| 广安市| 绥芬河市| 屯门区| 景德镇市| 临沧市| 秭归县| 自治县| 皮山县| 磐安县| 诸城市| 巴塘县| 华安县| 诏安县| 花莲市| 新和县| 海南省| 西藏| 丽江市| 平罗县| 鹤庆县| 福贡县| 青州市| 高雄县| 阳谷县| 秀山| 蒲城县| 寿光市| 六盘水市| 平顶山市| 卢氏县| 青河县| 美姑县| 延边| 洮南市| 姚安县| 鲜城|