iOS中Keychain保存用户名和密码
摘要:
有用户就用用户名和密码,而现在的应用都少不了一个保存用户名和密码用于自动登录的功能,本文介绍使用iOS自带的Keychain方法保存用户名和密码。
说到保存用户名和密码,以前有用过本地的数据库来保存,也接触过用userdefault来保存,后来在一个项目中发现了一个新的方法——用Keychain来保存。用过mac的人都不会对钥匙串感到陌生,这也是一个钥匙串,比起用数据库或者userdefault什么的来保存,这种方法会更安全一些,而且保存的内容不会随着应用的更新等删除,可以始终保存在沙盒中。这个方法还有一个优势,就是可以让用户名和密码在不同应用之间使用,一次保存,多次使用,这里推测一下,不知道使用第三方登录功能是不是用这个来实现的呢。一般自动登录不外乎对用户名和密码的保存、读取和修改,这里也主要讲这个三个功能的实现。
1、准备工作
要使用Keychain来操作,前期的准备还是有点麻烦的,因为不是直接可以拿来用的,而需要在工程中额外添加一些东西:
1)、导入secutity.framework
第一步需要额外导入一个安全框架,导入方法如下:
先在左侧文件列表中选中项目名称,然后选中TARGETS,中间界面选中Build Phases,在Link Binary With Libraries中点击加号,搜索找到secutity.framework导入即可:
这样就把secutity.framework导入到了我们的工程中来。
2)、添加KeychainItemWrapper.h/.m文件
除了secutity.framework,我们还要添加一个东西到工程中,就是KeychainItemWrapper.h和KeychainItemWrapper.m文件,这两个也需要额外引入才能在我们自己的代码中引用,就当成是引用第三方类库一样吧,这两个文件直接复制进工程里面就好了,可以在我的示例工程中复制。
3)、禁用KeychainItemWrapper.h/.m文件的ARC
现在已经流行ARC机制,我们创建工程也是默认的全局使用ARC,但是这两个文件因为年代久远吧,还不是ARC而是MRC,可以在其代码中看到大量MRC的内容比如release之类的,如果不加修改,直接运行会报很多错误,所以有两个解决办法,第一个把所有报错的地方由MRC方式改成ARC方式,这种方法太麻烦,第二种就是直接禁用这个文件的ARC就好了,方法如下:
先在左侧文件列表中选中项目名称,然后选中TARGETS,中间界面选中Build Phases,然后在Compile Sources中找到要禁用的文件,这里是KeychainItemWrapper.m,然后双击修改其Compiler Flags值为 -fno-objc-arc,如下:
这样再运行就不会出错了。
以上是准备工作,接下来进入代码。
2、使用Keychain保存用户名与密码
一般在应用的登录界面都会有保存用户名和密码的选项,这里我们模拟一下,在界面中放两个输入框用来输入用户名和密码,然后一个登录按钮来实现跳转和保存,界面如下:
把输入框和按钮都关联到我们的ViewController中去,然后在登录按钮的响应方法中实现保存功能,注意,在我们的ViewController中要导入Keychain文件才能正常使用:
// ViewController.m中
#import "KeychainItemWrapper.h"- (IBAction)login:(id)sender {NSString *username = self.usernameLabel.text;// 获取输入的用户名NSString *password = self.passwordLabel.text;// 获取输入的密码if (![username isEqualToString:@""] && ![password isEqualToString:@""]) {// 非空则保存KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"Login" accessGroup:nil];// 1[keychain setObject:username forKey:(__bridge id)(kSecAttrAccount)];// 2[keychain setObject:password forKey:(__bridge id)(kSecValueData)];// 3}
}
其他的不用多说,主要说说三行Keychain的操作:
1:这里是创建了一个keychain的对象,用来保存用户名和密码,创建的过程中有两个参数,一个是Identifier,这个参数是一个字符串,用来标识keychain,以后都根据这个标识来找到这里保存的内容;第二个是创建组,如果要在多个应用中使用Keychain,就要设置这个参数,是组的标识,这里我们只在本应用使用,就设为nil。Keychain还有很多属性可以设置,这里是最简单的用法,基本可以满足需求,如果想了解更多,可以继续查找资料了解。
2:我们的目的就是保存用户名和密码,Keychain保存非常简单,这一句代码就把用户名保存进去了,Keychain自己带有一些key值,各有各的用处,最常用的就是保存用户名和密码的,一般我们保存用户名就是放在这个Key中就好了。
3:同2一样,一般我们保存密码就是放在这个Key中的。除了这两个以外,还有一些其他的Key,有兴趣的可以继续了解。
这样我们就将用户名和密码保存在Keychain中了,非常简单吧。
3、获取用户名和密码
在一般的思路中,第一次登陆成功后,我们将已经验证正确的用户名和密码保存在keychain里,以后每次打开应用,我们就应该从keychain中获取曾经保存的用户名和密码来通过验证而不需要用户再次输入,对吧,要读取也非常简单,我们先创建一个界面,放两个Label用来在登录后从keychain中获取用户名和密码并显示出来,如下:
其实获取和保存就是两个相反的过程,也就是先通过之前保存时设的标识找到keychain,然后获取对应Key的内容:
// InfoViewController.m中
#import "KeychainItemWrapper.h"- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"Login" accessGroup:nil];// 通过同样的标志创建keychain// 获取对应Key里保存的用户名和密码NSString *username = [keychain objectForKey:(__bridge id)(kSecAttrAccount)];NSString *password = [keychain objectForKey:(__bridge id)(kSecValueData)];// 显示self.usernameLabel.text = username;self.passwordLabel.text = password;
}
一目了然,跟保存几乎一样只是设置变成了读取,这样就可以输入什么,显示什么了:
4、修改keychain中的值
一般有用户的应用,都会提供修改密码的功能,如果用户登录后修改了密码,我们总不能要求用户退出登录重新登录一次才能保存密码对吧,另一个情况,如果用户换了一个账号登录,那就是用户名和密码都改了,所以修改keychain中的值也是一个比较常用的功能。我们在界面中加一个新密码的输入框,加一个修改密码的按钮,再加一个显示新密码的Label,如图:
其实修改keychain中的值也特别简单,就跟修改dictionary中的值一样,通过标识找到keychain后,重新set对应Key的值就好了:
// InfoViewController.m中
#import "KeychainItemWrapper.h"- (IBAction)changePW:(id)sender {NSString *nPW = self.nPWText.text;// 获取新密码输入框的值if (![nPW isEqualToString:@""]) {// 非空则修改KeychainItemWrapper *keychain = [[KeychainItemWrapper alloc] initWithIdentifier:@"Login" accessGroup:nil];// 找到keychain[keychain setObject:nPW forKey:(__bridge id)(kSecValueData)];// 设置密码对应Key的值//重新读取并显示NSString *nPassword = [keychain objectForKey:(__bridge id)(kSecValueData)];self.nPWLabel.text = nPassword;}[self.nPWText resignFirstResponder];// 收起键盘
}
这样就可以修改了,再次获取的时候就是新设的值了,如下:
Keychain要完全了解,还是比较复杂的,但是最常用的功能,其实也就上面这些了,用起来非常简单方便,以后有机会再详细了解更多的内容吧。
这里可以下载到我的示例工程:https://github.com/Cloudox/KeyChainTest
转载请注明出处
iOS中Keychain保存用户名和密码相关推荐
- iOS 开发 -- 使用KeyChain保存用户名、密码并实现自动登录
一.前言 我的话,只是写了个keychain使用的工具类,让我们使用的时候可以直接调用接口,以求方便. 但是关于keychain的一些概念还有一些官方API我都不打算说的,当然你要看下面一些东西的话可 ...
- 如何在Git中保存用户名和密码?
本文翻译自:How to save username and password in Git? I want to use a push and pull automatically in GitEx ...
- Web项目,要求:保存用户名和密码在Cookie中,下次登录不再重新输入
设计一个实现登录功能的Web项目,要求:保存用户名和密码在Cookie中,下次登录不再重新输入 var cookie = {};//设置 cookie.SetCookies=function(name ...
- Linux中git保存用户名密码
Linux下命令行使用git,每次操作都要输入用户名和密码很麻烦,可以通过配置保存用户名和密码. 进入到git项目的根目录下,打开.git目录下的config文件 cd .git vim config ...
- Android复习05【网络编程---WebView获取文章信息、保存用户名与密码、设置菜单样式、收藏文章列表】
2020-04-02-星期四[源码可私聊我,QQ:386335886] 写篇文章不容易,点个赞再走吧,求求了~ 目 录 网络访问-思维导图 玩Android网站---查看登录Cookie 适配器 ...
- Android保存用户名和密码
我们不管在开发一个项目或者使用别人的项目,都有用户登录功能,为了让用户的体验效果更好,我们通常会做一个功能,叫做保存用户,这样做的目地就是为了让用户下一次再使用该程序不会重新输入用户名和密码,这里我使 ...
- mstsc保存用户名和密码,实现自动登录远程桌面
mstsc保存用户名和密码,实现自动登录远程桌面 https://blog.csdn.net/qq_23587541/article/details/82942365 MSTSC参数说明 首先可以使用 ...
- git用户名和密码保存文件_git保存用户名和密码
git保存用户名和密码 如果只是让git保存用户名的话可以使用下面你的命令 git config –global user.name testuser 这样每次你和remote的repository操 ...
- linux git 记录密码,linux git 保存用户名和密码
一.通过文件方式 1.在~/下, touch创建文件 .git-credentials, 用vim编辑此文件,输入内容格式: touch .git-credentials vim .git-crede ...
最新文章
- 删除一个无头单链表的非尾节点(C语言)
- WSFC真实场景仲裁处理
- 通过MySQL自动同步刷新Redis
- C# winFrom窗体设计问题-部分文件打不开窗体设计器 变成类.cs
- java代码split分割数字类
- MPEG4 笔记3(TRAK,TKHD, MVHD)
- 计算机基础阿春第十一讲,编程天才少年“顾神”,放弃清华保送,被麻省理工全额奖学金挖走...
- 创业案例:如何调整股权,才不伤害合伙人感情?
- vs2017更新出错:The entire Box execution exiting with result code: 0x0
- 计算机组成原理图ei,(完整版)计算机组成原理试题库(含答案)-
- 懂中文就能学会的高薪职位,你猜对了吗?
- php数据存储mysql_php mysqli 存储数据库
- org.dom4j.DocumentException: 1 字节的 UTF-8 序列的字节 1 无效。
- 深入浅出的web语义化理解
- 企业家论坛谋定转型 商协社团·万祥军:全国工商联促广东发展
- Flutter | bloc 之 state 使用优化
- xp系统怎样访问校园网服务器,有线校园网电脑连接教程
- APK反编译工具及方法
- nvidia卸载程序失败_彻底卸载NVIDIA GEFORCE EXPERIENCE不残留技巧
- 天冷 计算机无法启动,电脑也怕冷!低温竟会令硬盘无法启动!
热门文章
- 【软件测试】小陈她的测试追梦之路,实习开端到测试第一人......
- 2022-2028年中国中医医疗机构行业投资策略探讨及市场规模预测报告
- html评价标准展示,网页设计评分标准.doc
- webpack基础篇(三):管理资源(image、css、fonts、csv、json5)
- OpenCV(3.4.1)错误 Assertion failed (chunk.m_size 0xFFFF)
- WM开发常用资源下载 (转自黎波老师博客)
- 《东周列国志》第七十九回 归女乐黎弥阻孔子 栖会稽文种通宰嚭
- IDEA 界面主题字体修改
- cot函数 java_MySQL 数学函数
- Play Framework