iOS中利用KeyChain保存用户信息的方法示例
发布时间 - 2026-01-11 02:05:57 点击率:次前言

说到保存用户名和密码,以前有用过本地的数据库来保存,也接触过用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
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel Docker环境搭建教程_Laravel Sail使用指南
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
JavaScript数据类型有哪些_如何准确判断一个变量的类型
Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程
详解Huffman编码算法之Java实现
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
如何确保FTP站点访问权限与数据传输安全?
如何基于PHP生成高效IDC网络公司建站源码?
javascript基于原型链的继承及call和apply函数用法分析
如何在橙子建站中快速调整背景颜色?
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
Laravel Octane如何提升性能_使用Laravel Octane加速你的应用
Laravel如何使用Livewire构建动态组件?(入门代码)
Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?
如何用wdcp快速搭建高效网站?
python中快速进行多个字符替换的方法小结
如何在阿里云高效完成企业建站全流程?
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
创业网站制作流程,创业网站可靠吗?
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
如何用JavaScript实现文本编辑器_光标和选区怎么处理
Laravel如何创建自定义中间件?(Middleware代码示例)
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法
如何快速搭建虚拟主机网站?新手必看指南
如何解决hover在ie6中的兼容性问题
Laravel如何使用Blade模板引擎?(完整语法和示例)
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
Android自定义控件实现温度旋转按钮效果
如何做网站制作流程,*游戏网站怎么搭建?
如何快速登录WAP自助建站平台?
IOS倒计时设置UIButton标题title的抖动问题
*服务器网站为何频现安全漏洞?
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
JS去除重复并统计数量的实现方法
JavaScript如何实现类型判断_typeof和instanceof有什么区别
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
如何用花生壳三步快速搭建专属网站?
详解Android中Activity的四大启动模式实验简述
Bootstrap整体框架之JavaScript插件架构
Python函数文档自动校验_规范解析【教程】
Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】
JavaScript如何实现继承_有哪些常用方法

