之前做项目,用户保存账号密码都会保存到NSUserdefault中,每次卸载了app后,数据都会随之清除,而且不安全。后来系统就提供了keychain作为存储账号,密码,网络密码,认证令牌的工具,然后项目中就开始使用keychain来存储敏感信息,这些数据存储之后即使卸载了app也不会被清除。

下面就先来说说keychain的用法。

引入头文件#import

NSString * const KEY_USERNAME_PASSWORD = @"com.company.app.usernamepassword";

+ (void)keyChainSave:(NSString *)string {

NSMutableDictionary *tempDic = [NSMutableDictionary dictionary];

[tempDic setObject:string forKey:kSYDictionaryKey];

// [self save:kSYKeyChainKey data:tempDic];

[self setSaveObject:tempDic forKey:kSYKeyChainKey];

}

+ (NSString *)keyChainLoad{

NSMutableDictionary *tempDic = (NSMutableDictionary *)[self objectForKey:kSYKeyChainKey];

// [self load:kSYKeyChainKey];

return [tempDic objectForKey:kSYDictionaryKey];

}

+ (void)keyChainDelete{

[self removeObjectForKey:kSYKeyChainKey];

}

+ (NSMutableDictionary *)getKeychainQuery:(NSString *)service {

return [NSMutableDictionary dictionaryWithObjectsAndKeys:

(id)kSecClassGenericPassword,(id)kSecClass,

service, (id)kSecAttrService,

service, (id)kSecAttrAccount,

(id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible,

nil];

}

+ (void)setSaveObject:(id )value forKey:(NSString *)forKey{

//Get search dictionary

NSMutableDictionary *keychainQuery = [self getKeychainQuery:forKey];

//Delete old item before add new item

SecItemDelete((CFDictionaryRef)keychainQuery);

//Add new object to search dictionary(Attention:the data format)

[keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:value] forKey:(id)kSecValueData];

//Add item to keychain with the search dictionary

SecItemAdd((CFDictionaryRef)keychainQuery, NULL);

}

+ (id)objectForKey:(NSString *)service {

id ret = nil;

NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];

//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 = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData];

} @catch (NSException *e) {

NSLog(@"Unarchive of %@ failed: %@", service, e);

} @finally {

}

}

if (keyData)

CFRelease(keyData);

return ret;

}

+ (void)removeObjectForKey:(NSString *)service {

NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];

SecItemDelete((CFDictionaryRef)keychainQuery);

}

看完这些代码,可以发现keychain类似于数据库,有增删改查功能。

就这样,利用keychain很方便的保存了用户的登录信息,但是我们的项目又要求当用户卸载app重新安装后,不能保留用户信息。所以对于keychain,我百度搜了很多,但是都是不能清除。

最后想到一种办法,就是利用NSUserDefault看是否首次安装或重新安装,移除用户名,用户密码。

if (![[NSUserDefaults standardUserDefaults] objectForKey:@"FirstInstall"]) {

[[NSUserDefaults standardUserDefaults] setValue:@"isFirst" forKey:@"FirstInstall"];

[[NSUserDefaults standardUserDefaults] synchronize];

//首次安装,移除用户名,用户密码

[SYKeyChain removeObjectForKey:SYSaveAuthTokenKey_account];

[SYKeyChain removeObjectForKey:SYSaveAuthTokenKey_passwordTF];

}

注意,在.m中定义KEY_USERNAME_PASSWORD以上数据,如果要在其他页面用,要在.h中

UIKIT_EXTERN NSString *const KEY_USERNAME_PASSWORD;这样定义,然后在其他页面导入此控制器才行。

安卓设置keychain_Keychain的使用相关推荐

  1. 安卓设置keychain_keychain(一)

    iOS keychain 主要是用来保存一些用户敏感数据.比如用户密码,token.keychain是用SQLite进行存储的.用苹果的话来说是一个专业的数据库,加密我们保存的数据,可以通过metad ...

  2. 安卓设置均衡器 Equalizer

    前言 工作与音乐相关的,所以避免不了工作中要涉及到 Equalizer .中文叫均衡器,缩写就是 EQ,和情商的缩写一样.我先抛砖引玉,说直白点就是把声音优化来更好听.我直接搬移一段维基百科的说明,这 ...

  3. 巡线机器人 - PID控制 - 安卓设置

    巡线机器人 - PID控制 - 安卓设置 原文 该项目的目的是构建具有PID控制的巡线机器人.我们还将使用Android设备轻松设置主要控制参数,以便更好,更快地进行调谐.项目中用到的舵机也可用MG9 ...

  4. 【UE4(虚幻)】学习笔记(七)---- UE4安卓打包整理及安卓设置常用设置说明

    本次学习笔记分为两个部分: 1.整理UE4打包教程 2.补充说明打包中细节 一.整理UE4打包教程 哔哩哔哩 哔哩哔哩 上面两个视频参照着来理解打包,android配置文件建议下载一直闪光皮皮虾那个u ...

  5. 安卓设置Activity切换动画无效的问题

    做安卓App时,常会设置Activity之间切换的动画.常用的方法有两种,一种是用Activity的overridePendingTransition方法:另一种是用style文件通过xml进行设置. ...

  6. 安卓设置原生alert设置圆角_安卓手机设置充电提示音全新最全教程

    安卓版充电提示音教程_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​m.bilibili.com 哎,自从前端时间IOS14发布后,他的其他所有功能没有活,唯一火了充电提示音.奈何大傻没有苹果手 ...

  7. 安卓设置原生alert设置圆角_每个月流量都超额?安卓、苹果用户可以尝试更改这些设置...

    虽然目前三大运营商均针对手机流量的使用情况推出了专属的流量卡以及大流量套餐,但是相信不少用户每个月还是要缴纳一笔不小的流量费用,部分用户甚至出现了刚给手机充值完话费就出现余额不足的情况.其实出现这些情 ...

  8. 安卓设置菊花动画_华为手机必须调整的4个默认设置,让手机流畅到飞起,用到2035年...

    安卓手机用久了,难免都会出现卡顿的问题.这个问题一直困扰着大家,很多人每隔一两年就要换手机,真的太亏了.今天我们就以华为手机为例,讲一讲有什么办法,能解决手机卡顿的问题,希望对你们有帮助. 一.开发者 ...

  9. 安卓设置字符串样式,字符串中部分字体样式

    引言: 最近,我遇到一个问题,要显示一行字符串,但是要求部分的样式与整体不同.我以前实现这种操作的方法是用多个TextView分别设置样式.但是,今天我发现对于一些简单的样式设定,其实只用一个Text ...

最新文章

  1. Python培训教程分享:visual studio编写python怎么样?
  2. 拼多多员工爆料:拼多多开启硬核模式!午休减半!每月工作300小时!千万别来拼多多!...
  3. 第一百九十四节,jQuery EasyUI,Droppable(放置)组件
  4. Django URL
  5. php合同在线签约功能_【市场在线】杭汽辅机实现海外发电市场重大突破 —成功签约阿联酋Fujairah F3 IPP项目表冷器合同...
  6. sas Data步数据读取流程详解
  7. w3c html5 客户端缓存数据格式,Html5应用程序缓存(Cache manifest)
  8. R40 gpio 寄存器地址操作【原创】
  9. 阿里云物联网平台python开发手册_阿里云物联网平台之云端API调用(即云端开发教程)...
  10. ssas_通过SSAS透视图提高可读性
  11. 如何让Toast响应点击事件等基础Android基础文章N篇
  12. LINUX下查看CPU使用率的命令[Z]
  13. mongodb 如何更改端口号_Centos7配置MongoDB以及端口修改
  14. 如何将位图格式图片文件(.bmp)生成geotiff格式图片?
  15. Google浏览器清除缓存快捷键
  16. 富兰克林的十三种美德
  17. 关于三极管集电极电压1V以上后伏安特性曲线不右移
  18. 【研究】人大赵鑫老师报告:如何以初学者角度写好一篇国际学术论文?
  19. 人工智能应该用在这个地方!
  20. Vue实现在线编辑excel

热门文章

  1. 包装印刷行业裕同集团易普优APS项目顺利验收!
  2. 2021年9月Github优秀项目推荐
  3. IAR下连仿真器可以正常运行,程序下载到flash部分功能异常
  4. 结绳编程【简单计算】
  5. 英特尔oneAPI---跨架构实现高效率
  6. 【持续更新】java多线程面试题整理
  7. [操作系统]——进程与线程
  8. 广东海洋微型计算机控制技术试卷,历年真题:全国2017年4月自考02323操作系统概论考试试卷以及答案...
  9. java 事件分发线程_事件分发线程EDT
  10. 计算机绘图说课视频,说课稿认识画图软件