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如何实现继承_有哪些常用方法