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

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

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

前言

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

方法示例

一、新建一個(gè)LYKeychainTool類(lèi),導(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)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

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

    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中多線程的入門(mén)使用教程(Swift)

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

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

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

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

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

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

    iOS利用UIBezierPath + CAAnimation實(shí)現(xiàn)路徑動(dòng)畫(huà)效果

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

    iOS自定義身份證鍵盤(pán)

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

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

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

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

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

    詳解IOS中GCD的使用

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

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

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

最新評(píng)論

桓仁| 铜川市| 克拉玛依市| 元谋县| 连江县| 长岛县| 长乐市| 固安县| 汉阴县| 平凉市| 思南县| 屏南县| 宁城县| 九龙城区| 商洛市| 湖南省| 昭觉县| 越西县| 大丰市| 渭源县| 闽侯县| 永平县| 五常市| 广汉市| 深州市| 建宁县| 巴塘县| 唐山市| 南安市| 桂平市| 九江市| 洱源县| 阳高县| 楚雄市| 石家庄市| 浏阳市| 师宗县| 贺兰县| 鞍山市| 泌阳县| 祁阳县|