App密码自动填充


iOS和MacOS系统都集成了密码管理系统,网页中输入的密码,系统会询问用户是否存储以便于下一次登录相同网站时自动填充。然而在使用App过程当中,用户很可能已经在网页上登录了账户,却还要再次在手机上输入自己的帐号和密码。有没有更简洁的方式缩短用户登录App的时间来提升用户体验呢?
在今年的WWDC 2017上,苹果发布的iOS 11的系统API中便可以实现密码自动填充,并且iOS 11还在系统设置中提供了管理密码的功能。

密码管理

当系统获取到用户授权之后会安全的管理密码,并且在需要填写密码时主动提示用户。

iOS系统通过iCloud Keychain在登录相同appleID的设备之间共享密码,而iOS 11中,用户必须使用Touch ID 或者密码授权查看存储的密码。

接下来就介绍一下如何在App中实现密码自动填充。

密码自动填充

要在App中实现密码自动填充有一个必要的前提就是网站需要支持HTTPS协议,这个是必须的。所以要实现密码自动填充需要在AppWebsite进行设置。

App的设置

  1. 设置输入框的textContentType属性分别为usernamepassword
    这里的输入框不限于UITextFieldUITextView,其他遵循<UITextInput>的视图也可以。
    textContentType是在iOS 10中添加的一个枚举值,iOS 11中新增了usernamepassword。当账户输入栏和密码输入栏不在同一界面时,设置UITextContentType.username可以在不同界面键盘上均显示提示密码的QuickType Bar。很多App都会使用邮箱作为用户帐号,textContentType中也有emailAddress的选项,而当需要实现密码自动填充时,设置UITextContentType.usernameUIKeyboardType.emailAddress就可以解决这个问题。

    这时,用户就已经可以在登录时,通过点击QuickType Bar右侧的钥匙串按钮,在经过Touch ID验证后,选择需要登录的账户和密码。这里需要注意的是:帐号和密码都会被填充到相应的输入框;当Touch ID界面出现时,App进入不活跃状态,如果登录按钮状态需要随着输入栏输入发生改变,此时应该通过did change代理方法或者通知来进行接下来的操作。

  2. 设置Associated Domains
    webcredentials:输入关联的域名,例如:webcredentials:www.Ennnnnn7.com

    这里会发现下面两个勾选中Add the Associated Domains feature to your App ID.选项报错,这里需要登录开发者帐号,在Account->Certificates,IDs & Profiles->App IDs 中将绑定的App ID的 Associated Domains勾选,记录Prefix。

    这样,关于App相关的设置可以告一段落,接下来是对Website的配置。

Website的设置

网站中需要在下面的路径中返回对应的JSON。
路径:

// 将example.com替换为网站的Domain
// 两个路径二选一
https://example.com/.wll-known/apple-app-site-association
https://example.com/apple-app-site-association

JSON:

{
    "webcredentials":{
    // HB22SQJ4Pw 是上面记录下来的Prefix
    // com.example.Ennnnnn7 是关联应用的 Bundle ID
    "apps": [ "HB22SQJ4Pw.com.example.Ennnnnn7" ]
    }
}

这样就实现了在iOS 11系统中的密码自动填充功能,当系统中有已经记录的密码后,用户只需要点击一下QuickType Bar显示的密码,再点击登录按钮就可以有名有份地使用你的App了。

引用

WWDC-2017-Introducing Password AutoFill for Apps