iOS 开发 -- 使用KeyChain保存用户名、密码并实现自动登录

一、前言

我的话,只是写了个keychain使用的工具类,让我们使用的时候可以直接调用接口,以求方便。
但是关于keychain的一些概念还有一些官方API我都不打算说的,当然你要看下面一些东西的话可能对keychain需要有一个大概的认识。

至少至少你需要知道keychain的这些个API操作都是需要基于一个字典的,我们把它叫做queryDict好了。这个字典,它里面可以有的key和key对应可以设置的value很多都是定好的(官方文档上有,这些个key、value很多,好多我看不太懂,→_←),当然不是所有的key都需要设置。官方文档在描述SecItemCopyMatching方法使用时,关于如何构建一个query字典是这样说的:

You specify attributes defining a search by adding key-value pairs to the query dictionary.

A typical query consists of:

The class key (Item Class Key Constant) and a class value constant (Item Class Value Constants), which specifies the class of items for which to search.

One or more attribute key-value pairs (Attribute Item Keys and Values), which specify the attribute data to be matched.

One or more search key-value pairs (Search Keys), which specify values that further refine the search.

A return-type key-value pair (Search Results Constants), specifying the type of results you desire.

keychain的操作就是基于这样一个字典:
- 新增一个keychain item是加这样的包括特定键值对的字典(其实从keychain中取出一项的所有信息来看的话,它也就是通过键值对的形式保存了关于这个item的所有信息)
- 删除一个keychian item,也需要你传一个字典,然后所有item中有符合这个字典中所有键值对的item就会被删除
- 改一个keychain item的信息,同样也是需要先用字典的键值对匹配,找到需要改的那一项,然后一个新的键值对替换掉旧的相同key的键值对。
- 查找keychain中的某一个item,就是依据你给的键值对字典,所有键值对都能匹配上的话,这个item就会被查找出来。

具体的一些详情的话,去看看其他博客怎么说的吧,这篇博客好像说得还可以:
http://www.cnblogs.com/Jenaral/p/5663096.html
另外这篇文章讲KeyChain的用法好像也挺好的:
https://useyourloaf.com/blog/simple-iphone-keychain-access/

二、先看一下自己写的KeyChain工具类

在做app记住密码和自动登录的时候,想要试试用keychain,但是在网上找了些别人写的KeyChain三方,感觉没有好用的,所以就自己写了个keychain使用的工具类。
呃,自己的技术好像没多好,写的可能还有挺多bug的,可能内存管理也有问题,大伙如果会改的话就帮我改改呗,嘿嘿。放到gitHub上吧,喜欢可以来颗星吧,话说GitHub怎么用都没太管,哈哈。
GitHub地址: https://github.com/wushaojun315/KeyChainExample

KeyChain上面的东西仔细看的话还是非常多的,我就只是写了一点我要用到的东西,密钥类别也就只涉及到kSecClassGenericPassword这一类。

其实直接看代码也挺清除的,里面注释也写了很多,用起来还挺容易的吧,虽然可能会有些我没有发现的bug!

2.1. ZZZKeyChainHelper类

首先需要说明,我的KeyChain工具类中保存的账户名密码信息分了两种:
- 普通的账户名密码(用于我们通过用户名获取密码)
- 用于自动登录的账户名密码(用于进入应用后获取应用名密码直接自动登录,不通过登录页面输入信息)

两者基础的query字典是不一样的,而且用于自动登录的账户名密码在keychain中只有一个。

普通的账户名密码中基础的query字典是包含的键值对有:
1. kSecClass:kSecClassGenericPassword
这个表示我们保存的是普通的用户名密码。其他的什么证书什么的我们不涉及。
2. kSecAttrAccount:对应的账户名
这个就是保存对应账户的用户名了,而且这个键值对是保证在keychain所有item里面,每个item都与其他item不一样的标记(默认账户名不能相同)
3. kSecAttrService:@”com.companyName.appName”
这个是一个其他标记,对于普通类型的来说,所有的item的这个键值对都是一样的,你们可以随意更改后面的这个字符串值。

用于自动登录的用户名密码的基础query字典包含的键值对有:
1. kSecClass:kSecClassGenericPassword
这个表示我们保存的是普通的用户名密码而不是保存的什么证书信息,跟上面的普通账户类型相同。
2. kSecAttrService:@”autoLoginAccountIdentifierTag”
这个是我为自动登录账户设定的一个标记,跟上面的普通类型不一样。

通过这样两种基础query字典,我们可以保证keychain中每一项的唯一性。
但是这样的话,我们会发现,同一个账户,他可以在普通的保存一份,也可以在自动登录的保存一份。所以为了避免这个问题,我们就在保存到自动登录之前,先将普通的那一份删除即可。(已经在工具类中有实现了,不想要的话去找到对应代码删掉吧!)
我们通过用户名查找对应密码的时候,因为对应一个用户名里面只会有一份信息,所以就不要加kSecAttrService这个key到字典中了,这样就既可以查到普通类型中的,又可以查到自动登录类型中的。

2.2. 普通账户保存暴露的接口

/**
 增:将账户信息保存到keychain中
    当用户名输入框输入完毕之后,如果在keychain中有对应用户名的账户信息,就获取对应密码填入密码输入框中
    (实际上,app应用应该都是用户名框中有所有已经保存好的账户信息,可以直接下拉选择的,这样做更常见吧,但是下拉那个东西我懒得写了,哈哈)

 @param accountIdentifier 用于保存到keychain中账户信息的账户id(这个是登录信息的唯一标识,也作为keychain里面item的唯一标识,一般可以直接传入登录用户名,如果登录用户名也唯一的话)
 @param accountPassword 用于保存到keychain中账户信息的账户密码
 @return 新增是否成功
 */
+ (BOOL)addAccountInfoToKeyChainWithAccountIdentifier:(NSString *)accountIdentifier
                                      accountPassword:(NSString *)accountPassword;


/**
 删:根据账户id的唯一性从keychain中删除对应账户的信息

 @param accountIdentifier 唯一标识一个keychain item的项,也是一个账户的唯一标识(例如,登录用户名)
 @return 删除是否成功
 */
+ (BOOL)deleteAccountInfoFromKeyChainWithAccountIdentifier:(NSString *)accountIdentifier;


/**
 改:修改对应账户id的keychain项信息(主要修改对应账户的账户密码,一般不会直接调用
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值