使用KeyChain保存用户信息

作者: Fisher123 | 来源:发表于2017-06-23 11:03 被阅读0次

    1.新建一个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
    
    

    2.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
    
    

    3.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
    
    

    4.效果如下图:


    相关文章

      网友评论

        本文标题:使用KeyChain保存用户信息

        本文链接:https://www.haomeiwen.com/subject/asxccxtx.html