APP钥匙串存储多条信息Demo

作者: 电动鸡翅 | 来源:发表于2017-04-28 00:28 被阅读310次

一、钥匙串存储相比其他存储的优点
APP删掉下次下载能记住存在钥匙串中的信息,多用于账号密码、设备唯一标识符的存储等GitHub:XKeyChain

二、Demo效果
Demo有两个界面,分别有一个输入框,一个存入钥匙串按钮一个删除钥匙串信息按钮。
1、输入框输入内容,点击存入钥匙串的按钮,删除App。重新下载(编译)可以看到之前输入的内容还显示在输入框
2、点击删除那个按钮,重新下载(编译),输入框内容不存在了

三、主要代码如下
1、h文件

#import Foundation/Foundation.h
#import Security/security.h

@interface XKeyChain : NSObject

/**
保持数据到钥匙串的方法
@param data 对应字典的值(保存的文本信息)
@param key  对应字典的键(一条信息一个键)
这对键值保存在单例的字典里
*/
+ (void)saveData:(id)data key:(NSString *)key;

/**
加载存在钥匙串中键对应的信息
@param key 对应的键
@return 键对应的值
*/
+ (id)loadDataKey:(NSString *)key;

/**
删除该APP存在钥匙串中的所有信息(一般用不上)
*/
+ (void)deleteData;

2、m文件

#import "XKeyChain.h"
#import "InfoManager.h"

static NSString *const KEY_BUILD_ID = @"demo.xzr.KeyChain"; //区分app的键(每个app不一样)
static NSString *const KEY_BUILD_ID_SUB = @"demo.xzr.passWord"; //与keyBuildId唯一对应生成的键,该键对应的值就是具体存在钥匙串中的信息(包括多条信息)

@implementation XKeyChain

/**
把信息存放到钥匙串当中
@param data 存放的信息(可以是字典、数组、字符串)
@param key 键值(传入不同键值实现多次信息存储)
*/
+ (void)saveData:(id)data key:(NSString *)key{
NSMutableDictionary *informationDic = [NSMutableDictionary dictionary];
InfoManager *manager = [InfoManager share];
[manager.singleDic setObject:data forKey:key];
[informationDic setObject:manager.singleDic forKey:KEY_BUILD_ID_SUB];
[self saveInformationDic:informationDic];
}

+ (void)saveInformationDic:(NSMutableDictionary *)informationDic {
//Get search dictionary
NSMutableDictionary *keychainQuery = [self getKeychainQuery:KEY_BUILD_ID];
//Add new object to search dictionary(Attention:the data format)
[keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:informationDic] forKey:(id)kSecValueData];
//Add item to keychain with the search dictionary
SecItemAdd((CFDictionaryRef)keychainQuery, NULL);
}

/**
获取存在钥匙串中的信息
@param key 对应的键值
@return 钥匙串中对应键的值
*/
+ (id)loadDataKey:(NSString *)key {
NSMutableDictionary *keyBuildIdSubDic = [self load:KEY_BUILD_ID];
NSMutableDictionary *informationDic = keyBuildIdSubDic[KEY_BUILD_ID_SUB];
return informationDic[key];
}

+ (NSMutableDictionary *)load:(NSString *)keyBuildId {
NSMutableDictionary *ret = [[NSMutableDictionary alloc] init];
NSMutableDictionary *keychainQuery = [self getKeychainQuery:keyBuildId];
//Configure the search setting
//Since in our simple case we are expecting only a single attribute to be returned (the password) we can set the attribute kSecReturnData to kCFBooleanTrue
[keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];
[keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];
CFDataRef keyData = NULL;
if (SecItemCopyMatching((CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
@try {
ret = (NSMutableDictionary *)[NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData];
} @catch (NSException *e) {
NSLog(@"Unarchive of %@ failed: %@", keyBuildId, e);
} @finally {
}
}
if (keyData)
CFRelease(keyData);
return ret;
}

/**
删除存在钥匙串中该APP的所有信息
*/
+ (void)deleteData {
NSMutableDictionary *keychainQuery = [self getKeychainQuery:KEY_BUILD_ID];
SecItemDelete((CFDictionaryRef)keychainQuery);
}

+ (NSMutableDictionary *)getKeychainQuery:(NSString *)keyBuildId {
return [NSMutableDictionary dictionaryWithObjectsAndKeys:
(id)kSecClassGenericPassword,(id)kSecClass,
keyBuildId, (id)kSecAttrService,
keyBuildId, (id)kSecAttrAccount,
(id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible,
nil];
}

其中manager是个单例对象 里头有一个可变字典singleDic。用于存储钥匙串中的信息

四、可以参考我画的思维导图

五、还有不清楚的可以下载该文章对应的GitHub代码:XKeyChain 。如果有疑问或者批判请不要吝啬,喜欢就点个赞呗,谢谢大家!

六、参考文献
1、iOS简单使用keychain存储密码
2、百度百科
3、iOS中Keychain保存用户名和密码

相关文章

  • APP钥匙串存储多条信息Demo

    一、钥匙串存储相比其他存储的优点APP删掉下次下载能记住存在钥匙串中的信息,多用于账号密码、设备唯一标识符的存储等...

  • 【OC】钥匙串使用

    钥匙串可存储少量数据,常用于App删除后数据依然存储在本地的需求 1.增(存储) 2.查 3.改 4.删 Demo...

  • 钥匙串使用

    iOS提供一种安全的存储数据的方式,就是钥匙串,想要在app中使用钥匙串,首先要开启钥匙串访问的功能,即在app ...

  • 利用钥匙串存储账号信息

    如何利用钥匙串存储App的账号信息,废话不多说直接上代码 .h .m 使用 ![Uploading 645977-...

  • UICKeyChainStore与渠道包

    先说结论:ipa的签名信息不一样会导致UICKeyChainStore(钥匙串)存储的值不一样。 最近有个App需...

  • iOS 持久化存储

    KeyChainKeyChain(钥匙串)存储是Apple平台一个专门用来存储用户敏感信息的一种存储方式,一般用来...

  • iOS密码管理Keychain的使用

    keychain(钥匙串)存储在iOS系统中,并且恢复iPhone会使keychain的内容也恢复.但是删除App...

  • iOS密码管理Keychain的使用

    keychain(钥匙串)存储在iOS系统中,并且恢复iPhone会使keychain的内容也恢复.但是删除App...

  • ios 证书总结

    1.首先通过钥匙串访问——证书助理——从证书颁发机构请求证书——填写证书信息(邮箱,常用名称,存储到磁盘)——存储...

  • iOS KeyChain-应用间共享数据

    1、KeyChain是什么? KeyChain的作用:可将用户信息加密存储在钥匙串中,保证用户信息的安全性;另外多...

网友评论

  • 写代码的小农民:iOS10之后keychain是不是不能用了?
    Mg明明就是你:@写代码的小农民 可以用,为什么不能用呢?
    电动鸡翅:@写代码的小农民 iOS模拟器的10.3.1系统任何机型都可以使用
    电动鸡翅:@写代码的小农民 也看到很多新闻说不能用,但测试过在iPhone6s plus 64g 土豪金 iOS10.3可以使用。

本文标题:APP钥匙串存储多条信息Demo

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