前言

说到保存用户名和密码,以前有用过本地的数据库来保存,也接触过用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小时内与您取得联系。