全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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  # keychain  # 保存用户信息  # keychain用法  # 详解iOS使用Keychain中的kSecClassGenericPassword存储数据  # IOS开发使用KeychainItemWrapper 持久存储用户名和密码  # 详解iOS开发中Keychain的相关使用  # iOS数据持久化KeyChain数据操作详解  # 说了  # 不多  # 说到  # 这篇文章  # 谢谢大家  # 接触过  # 如下图  # 新建一个  # 发现了  # 有用过  # 有疑问  # saveKeychainValue  # key  # NSString  # void  # return  # param  # NSObject  # interface  # sValue 


相关文章: 网站制作与设计教程,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站之星导航如何优化提升用户体验?  如何用美橙互联一键搭建多站合一网站?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  常州企业网站制作公司,全国继续教育网怎么登录?  如何用景安虚拟主机手机版绑定域名建站?  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  c++ stringstream用法详解_c++字符串与数字转换利器  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  建站之星如何一键生成手机站?  股票网站制作软件,网上股票怎么开户?  设计网站制作公司有哪些,制作网页教程?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  网站制作公司排行榜,抖音怎样做个人官方网站  C#如何在一个XML文件中查找并替换文本内容  制作企业网站建设方案,怎样建设一个公司网站?  建站之星导航菜单设置与功能模块配置全攻略  XML的“混合内容”是什么 怎么用DTD或XSD定义  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  如何选择高效可靠的多用户建站源码资源?  如何续费美橙建站之星域名及服务?  建站之星各版本价格是多少?  b2c电商网站制作流程,b2c水平综合的电商平台?  实例解析angularjs的filter过滤器  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  定制建站价位费用解析与套餐推荐全攻略  建站ABC备案流程中有哪些关键注意事项?  建站之星在线版空间:自助建站+智能模板一键生成方案  如何获取开源自助建站系统免费下载链接?  Python文件管理规范_工程实践说明【指导】  宝塔建站后网页无法访问如何解决?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  建站之星后台管理:高效配置与模板优化提升用户体验  建站之星如何保障用户数据免受黑客入侵?  七夕网站制作视频,七夕大促活动怎么报名?  如何用西部建站助手快速创建专业网站?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  电商平台网站制作流程,电商网站如何制作?  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  定制建站是什么?如何实现个性化需求?  如何快速生成专业多端适配建站电话?  个人摄影网站制作流程,摄影爱好者都去什么网站?  网站好制作吗知乎,网站开发好学吗?有什么技巧?  如何使用Golang安装API文档生成工具_快速生成接口文档  如何在香港免费服务器上快速搭建网站?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何通过云梦建站系统实现SEO快速优化?  ,巨量百应是干嘛的? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。