Apple开发_使用keyChain(钥匙串)保存数据

1、场景了解

  • keyChain是ios中唯一可以存储安全可靠敏感数据的地方。而且应用被卸载,数据也不会被删除,所以非常可靠。
  • 苹果官方的操作keychain,比较繁琐和隐晦,这里使用开源的第三方库SAMKeychain

2、操作步骤

  • 2.1 引入文件

    • 下载SAMKeychain.h、SAMKeychain.m、SAMKeychainQuery.h、SAMKeychainQuery.m这4个文件并导入项目中。
    • 文件中同时包含一个国际化用的文件包,可以一起导入项目中。
    • 在.mm文件中引用SAMKeychain(#include "SAMKeychain.h")
  • 2.2 调用SAMKeychain的API,我做成了工具分类

    • CHTool+Keychain.h
    @interface CHTool (Keychain)
    
    /**
     传入服务与键名获取钥匙串存储值
     一般情况1个服务下,会包含多个内容
    
     @param service 服务名
     @param key          键名
     @return        钥匙串存储值
     */
    + (NSString *)getContentFromKeyChain:(NSString *)service
                                  ForKey:(NSString *)key;
    
    /**
     传入存储内容、键名、与服务 向钥匙串中 存储内容
     一般情况1个服务下,会包含多个内容
     
     @param content 存储内容
     @param service 服务名
     @param key          键名
     @return       存储成功与否
     */
    + (BOOL)saveContentToKeyChain:(NSString *)content
                           ForKey:(NSString *)key
                          Service:(NSString *)service;
    /**
     传入键名、与服务 向钥匙串中 移除存储内容
     一般情况1个服务下,会包含多个内容
     
     @param service 服务名
     @param key          键名
     @return       移除成功与否
     */
    + (BOOL)removeContentFromKeyChain:(NSString *)key
                              Service:(NSString *)service;
    
    @end
    
    • CHTool+Keychain.m
    #import "CHTool+Keychain.h"
    
    #include "SAMKeychain.h"
    
    @implementation CHTool (Keychain)
    
    /**
     传入服务与键名获取钥匙串存储值
     一般情况1个服务下,会包含多个内容
    
     @param service 服务名
     @param key          键名
     @return        钥匙串存储值
     */
    + (NSString *)getContentFromKeyChain:(NSString *)service
                                  ForKey:(NSString *)key {
        return [SAMKeychain passwordForService:service account:key];
    }
    
    /**
     传入存储内容、键名、与服务 向钥匙串中 存储内容
     一般情况1个服务下,会包含多个内容
     
     @param content 存储内容
     @param service 服务名
     @param key          键名
     @return       存储成功与否
     */
    + (BOOL)saveContentToKeyChain:(NSString *)content
                           ForKey:(NSString *)key
                          Service:(NSString *)service {
        return [SAMKeychain setPassword:content forService:service account:key];
    }
    
    /**
     传入键名、与服务 向钥匙串中 移除存储内容
     一般情况1个服务下,会包含多个内容
     
     @param service 服务名
     @param key          键名
     @return       移除成功与否
     */
    + (BOOL)removeContentFromKeyChain:(NSString *)key
                              Service:(NSString *)service {
        return [SAMKeychain deletePasswordForService:service account:key];
    }
    
    @end
    
  • 2.3 使用接口

    • 可以依次删除及屏蔽观察结果。
    NSString *Key = @"Number";
    NSString *Service = @"MyData";
    
    BOOL save = [CHTool saveContentToKeyChain:@"999988" ForKey:Key Service:Service];
    CHLog(@"保存成功 ==== %d", save);
    NSString *content = [CHTool getContentFromKeyChain:Service ForKey:Key];
    CHLog(@"取出内容 ==== %@", content);
    BOOL remove = [CHTool removeContentFromKeyChain:Key Service:Service];
    CHLog(@"删除内容 ==== %d", remove);
    
    • 注意⚠️:这几个方法在Mac上无效,仅支持iPhone、iPad。
posted @ 2022-04-27 16:44  CH520  阅读(603)  评论(0编辑  收藏  举报