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

 更新时间:2017年06月28日 11:38:50   作者:Hello0307  
有用户就用用户名和密码,而现在的应用都少不了一个保存用户名和密码用于自动登录的功能,本文介绍使用iOS自带的Keychain方法保存用户名和密码信息的相关资料,需要的朋友可以参考参考借鉴,下面来一起看看吧。

前言

说到保存用户名和密码,以前有用过本地的数据库来保存,也接触过用userdefault来保存,后来在一个项目中发现了一个新的方法——用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

四、效果如下图:

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • iOS实现scrollview上拉显示Navbar下拉隐藏功能详解

    iOS实现scrollview上拉显示Navbar下拉隐藏功能详解

    这篇文章主要给大家介绍了利用iOS实现scrollview上拉显示Navbar下拉隐藏功能的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-05-05
  • iOS中多线程的入门使用教程(Swift)

    iOS中多线程的入门使用教程(Swift)

    这篇文章主要给大家介绍了关于iOS中多线程入门使用的相关资料,一个进程中可以开启多条线程,每条线程可以并行执行不同的任务,本文通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-11-11
  • iOS中在APP内加入AppStore评分功能的实现方法

    iOS中在APP内加入AppStore评分功能的实现方法

    这篇文章主要介绍了iOS中在APP内加入AppStore评分功能的实现方法,文中笔者给大家整理了三种方式,大家可以根据自己的需求选择,需要的朋友可以参考下
    2017-11-11
  • 针对iOS10新增Api的详细研究

    针对iOS10新增Api的详细研究

    这篇文章主要针对iOS10新增Api进行详细研究,基于Api层面,着重看一些具体用法所做的笔记,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • iOS利用UIBezierPath + CAAnimation实现路径动画效果

    iOS利用UIBezierPath + CAAnimation实现路径动画效果

    在iOS开发中,制作动画效果是最让开发者享受的环节之一,这篇文章主要给大家介绍了关于iOS利用UIBezierPath + CAAnimation实现路径动画效果的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-10-10
  • iOS自定义身份证键盘

    iOS自定义身份证键盘

    这篇文章主要为大家详细介绍了iOS自定义身份证键盘,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • 详解iOS应用中播放本地视频以及选取本地音频的组件用法

    详解iOS应用中播放本地视频以及选取本地音频的组件用法

    这里来为大家详解iOS应用中播放本地视频以及选取本地音频的组件用法,分别使用MPMoviePlayerControlle和MPMediaPickerController来实现,两个都是MediaPlayer.framework中的多媒体组件,所以我们放到一起来讲.
    2016-06-06
  • IOS 开发之触摸事件详细介绍

    IOS 开发之触摸事件详细介绍

    这篇文章主要介绍了IOS 开发之触摸事件详系介绍的相关资料,需要的朋友可以参考下
    2017-02-02
  • 详解IOS中GCD的使用

    详解IOS中GCD的使用

    GCD是iOS的一种底层多线程机制,本文给大家详细介绍IOS中GCD的使用,需要的朋友参考下吧
    2016-02-02
  • 你应该知道的tableViewCell行高计算处理

    你应该知道的tableViewCell行高计算处理

    这篇文章主要给大家介绍了关于tableViewCell行高计算的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12

最新评论