iOS 11 新特性:App 密码自动填充

上篇文章讲到了使用第三方App 1Password 集成到自己App内实现密码的填充和管理,iOS 11 之后苹果官方推出了类似的功能并且直接集成到了iOS 系统,这个功能官方称之为:Password AutoFill

iOS 和 macOS 的Safari 浏览器都内建密码管理器,使用Safari 进行网页登陆的时候,Safari 会询问是否保存密码,下次登录的时候Safari 可以为用户自动填充之前保存的密码,而 Password AutoFill 是iOS11 新增的一个功能,这一功能的实现能够让用户在 App 内进行密码填充以及密码管理

如何实现

在iOS 11 中 UITextField 的 ContentType 新增了两个类型用于实现Password AutoFill

我们需要在代码里面把用户名和密码的TextField输入框的ContentType 分别设置为.username. password

1
2
usernameTF.textContentType = UITextContentType.username
usernameTF.textContentType = UITextContentType.password

这时候用户在需要在输入用户名与密码的时候,可以通过点击 QuickType bar 右侧的钥匙串按钮,在所有的保存的密码中选择要填充的用户名和密码了

但是这样看起来还是不够方便,因为如果用户保存了非常多的密码,那就需要从列表中去查找,但是如果能让系统根据打开的 App 把候选的密码展示出来我们只需要选择就能理解填充岂不是更加方便?如下图那样的效果:

关联 App 和网站

App 设置

如果 App 已经适配了 Universal Link,那网站跟 App 就已经关联起来了,iOS 系统会把正确的登录信息显示在 QuickType bar 上,如果没有实现 Universal Link 可以使用以下方式把 APP 和自己的网站进行关联

首先,我们需要在 Xcode 上的 Associated Domains(关联域,Capabilities -> Associated Domains) 添加网站域,格式为:webcredentials+我们的网站域名

登录Apple开发者网站,确认Associated Domains已经启用。另外记录一下当前应用的 Prefix,后面会用到

网站设置

新建一个 Associated Domains File 内容如下:

1
2
3
4
5
6
7
{
"webcredentials":{
"apps":["E5336VM85F.com.example.Shiny"]
//E5336VM85F 是上面记录下来的Prefix,后面是需关联的应用的 Bundle ID ,
//和 Universal Link 类似
}
}

把这个文件添加到以下网站目录:

1
2
https://example.com/.well-known/apple-app-site-association
https://example.com/apple-app-site-association

网站设置完成后,再次运行App,App会在启动时访问上面的地址进行验证

验证通过后就可以在填充密码的时候在QuickType bar 上展示与该网站相关的密码了,如果验证不通过重新检查网站和App的相关设置

上面的设置完成之后,用户按照下面的步骤去设置里面保存账号密码

以上就是 App 自动填充密码功能的实现,文章参考自 Introducing Password AutoFill for Apps