A571fbc4858933081dca3462d28e7a6f
WWDC 2018: 自动化强密码生成和短信安全码填写

本篇文章是 WWDC Session 204: Automatic Strong Passwords and Security Code AutoFill 观后感,建议与视频同时观看。

iOS 12 为用户带来了强密码生成和短信安全码自动填写功能。长期以来,“密码” 在日常使用手机的时候可能是一个极大的痛点。所有的应用使用同一个密码十分不安全,但是频繁的替换熟知的密码串又十分难以记忆。这正如 Session 204 中的 Chelsea 所说:Passwords are a pain

长期以来,有很多密码管理器的产品,为用户创建和填写密码,这应该是密码用户级管理的最佳体验。但是 iOS 12 AutoFill 将会让你在 keychain 提示、密码管理、短信验证补全等功能的体验有大幅度的上升。

这篇文章将从 WWDC 的五个方面分别介绍关于 iOS 12 中的 AutoFill 功能、开发者使用方式及其扼要原理。

密码自动填写(Password AutoFill)

在 iOS 12 中,Password AutoFill 这项功能可以帮助用户快速登陆,Chelsea 向我们展示了他们的一个实例 Demo,这是关于 shiny 这个 App 在 Password AutoFill 功能上的应用:

我们可以看到,当进入用户登陆页的时候,在键盘上方会多出一个提示窗口(称为 QuickType Bar),它根据 App 设置的 Domain 从而给用户一个建议的登陆邮箱。其实 iCloud 中的 Keychain Password Manager 中的密码就是基于 Web 上的 Domain 来存储的,例如 apple.com 这样。因此你的 App 和 Web 上 Domain 间的关联十分重要。这个关联需要在 Entitlements 文件上进行少量的修改,并且需要在服务端做一些操作。关于这方面如果你想了解更多,请看 WWDC 2017 的 Intruducing Password Autofill for Apps 那个 Session。

为了让我们自己的 App 中实现这个便捷功能,我们需要设置一下 UITextFieldtextContentType 属性。让 usernamepassword 对应的控件满足对应的 textContentType 类型。

// For user name text field
let userTextField = UITextField() 
userTextField.textContentType = .username

// For password text field
let passwordTextField = UITextField()
passwordTextField.textContentType = .password

另外值得一提的是,在 iOS 12 中 WKWebView 也已经支持密码自动填写功能,这对于一个跨平台应用的使用是十分便捷的。还有,在 App 的首次登陆后回有这么一个弹框来让用户确认是否记录该登陆凭证,当用户确认后回通过 iCloud 记录到密码管理器中。下图是密码记录的大体工作流程:

另外在密码保存的过程中,开发者需要考虑一些兼容性的 case。以下是兼容性的清单,它们可以保证 AutoFill 功能的正常运作:

  1. 确保你的用户名和密码的 UITextField 已经对 textContentType 属性赋值;
  2. 当登陆行为发生时,请从视图层级中移除掉登陆功能的 UITextField,可以通过 dismiss 掉登陆的 View Controller 来实现;
  3. 在保证 2 的前提下,对 UITextField 的内容清空,使得 AutoFIll 能读到数据并将其保存;
  4. 核查 AutoFill 的信息对映正确的 domain,如果不正确可以通过 Web credentials associated domain service 覆盖;
  5. 现在无需调用 SecAddSharedWebCredential() 方法来保存;

最后我们来总结一下关于自动密码填充设置的关键:

  • 将 App 与指定的 domain 关联;
  • UITextFieldtextContentType 属性赋值;
  • 确保登陆动作的 AutoFill 条件满足;

自动强密码生成(Automatic Strong Passwords)

用户系统第二个耗时操作就是用户注册过程。当我们创建账户的时候,最头疼的就是设定密码这个步骤。使用我们熟悉的信息或者固定的密码回造成不安全性,但是为每一个应用创建一个唯一的强密码这会极大的提升我们记忆工作量。在 iOS 12 中的自动强密码生成就可以解决这个痛点。

自动强密码生成提供生成建议用户名、密码以及保存管理的功能,通过几次按钮点击便可完成注册。自动强密码生成和之前的密码保存流程大致类似:

  1. 系统自动推断 View Controller 类型;
  2. 通过关联的 domain 检查凭据;
  3. 检测页面中带有类型的 UITextField 空间,例如用户名和密码;
  4. 提供建议的用户名;
  5. 自动生成强密码;
  6. 点击保存操作成功;

为了开发者开发方便,与密码保存功能类似的,如果想让该功能正常运作,请注意检查以下兼容性问题:

对于密码修改场景的注意事项

// For user name text field
let userTextField = UITextField() 
userTextField.textContentType = .username

// For new password text fields
let newPasswordTextField = UITextField() 
newPasswordTextField.textContentType = .newPassword

let confirmNewPasswordTextField = UITextField() 
confirmNewPasswordTextField.textContentType = .newPassword

在编写 UITextField 逻辑的时候,请确认 textContentType 的类型是 .newPassword 枚举种类,只有这样系统才能正确检测并使该功能运作。

请务必确认用户名和密码的 UITextField 在同一页面上,因为系统的检测手段是以页面为基础的。另外,用户名 UITextField 可以是只读的。

强密码格式化方案

自动强密码生成功能中,我们所谓的“强密码”是遵循这种格式的:

  • 长度不少于 20 个字符;
  • 包括大写字母、小写字母、数字和连字符;
  • 超过 71 bits 的熵;
top Created with Sketch.