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实现设备判断是否安装相关地图(百度、高德等)

    iOS实现设备判断是否安装相关地图(百度、高德等)

    这篇文章主要给大家介绍了关于iOS如何实现设备判断是否安装相关地图,比如百度、高德等,其实实现的方法还是很简单,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友下面来一起看看吧。
    2018-01-01
  • iOS面试中如何优雅回答Block导致循环引用的问题

    iOS面试中如何优雅回答Block导致循环引用的问题

    这篇文章主要给大家介绍了iOS面试中关于如何优雅回答Block导致循环引用的问题的相关资料,文中通过图文介绍的非常相信,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-03-03
  • 移动端固定输入框在底部会被键盘遮挡的解决方法(必看篇)

    移动端固定输入框在底部会被键盘遮挡的解决方法(必看篇)

    下面小编就为大家分享关于移动端固定输入框在底部会被键盘遮挡的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • 关于iOS自适应cell行高的那些事儿

    关于iOS自适应cell行高的那些事儿

    这篇文章主要给大家介绍了关于iOS自适应cell行高的那些事儿,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一看看吧
    2018-11-11
  • iOS实现屏幕亮度和闪光灯控制的实例代码

    iOS实现屏幕亮度和闪光灯控制的实例代码

    本篇文章主要介绍了iOS实现屏幕亮度和闪光灯控制的实例代码,具有一定的参考价值,有兴趣的可以了解一下
    2017-06-06
  • IOS实现的简单画板功能

    IOS实现的简单画板功能

    本文主要介绍了IOS实现简单画板的示例代码。具有很好的参考价值。下面跟着小编一起来看下吧
    2017-04-04
  • xcode 详解创建静态库和动态库的方法

    xcode 详解创建静态库和动态库的方法

    这篇文章主要介绍了xcode 详解创建静态库和动态库的方法的相关资料,这里对创建静态库和动态库的方法详细介绍,需要的朋友可以参考下
    2017-01-01
  • iOS字体大小适配的3种方法示例代码

    iOS字体大小适配的3种方法示例代码

    这篇文章主要给大家介绍了关于iOS字体大小适配的3种方法,文中通过示例代码介绍的非常详细,对各位iOS开发者们具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • iOS学习笔记之远程推送、静默推送与自定义消息推送

    iOS学习笔记之远程推送、静默推送与自定义消息推送

    推送是各位iOS开发者们都会遇到的一个功能,下面这篇文章主要给大家介绍了关于iOS学习笔记之远程推送、静默推送与自定义消息推送的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-08-08
  • Apple Watch App Lifecycle应用开发

    Apple Watch App Lifecycle应用开发

    这篇文章主要为大家介绍了Apple Watch App Lifecycle应用开发示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10

最新评论