iOS 11 里 App 终于可以密码自动填充了

作者:四娘 @kemchenj

密码自动填充

iOS 11 新增了密码自动填充的 API,可以让用户在 App 里使用保存在 Safari 以及 keychain 里的密码。

iOS 以及 macOS 上的 Safari 都内建了密码管理器,每次我们在网页里登录时,Safari 都会询问我们是否要保存密码,然后当我们下一次登录同一个网站的时候,Safari 就会为我们自动填充之前保存的密码。并且这些密码会通过 iCloud keychain 同步到用户所有设备上。

iOS 11 更进了一步,让这些已经保存在 keychain 的密码显示在 App 的虚拟键盘上,接下来让我们来看个 demo:

这里展示的是一个很常见的登录页面,当我们点击输入框的时候,键盘上的 QuickType bar 就会显示出我们之前保存过密码。

点击一下之后,就会把账户和密码自动填充上去。

让 QuickType bar 正确地出现

让 QuickType bar 出现有这么几个条件:

  • 密码已经保存在 keychain 里
  • 使用原生的 UITextFieldUITextView,或者是遵循 <UITextInput> 的控件
  • iOS 会智能判断哪一个控件要展示 QuickType bar
  • 也可以由开发者手动控制让 QuickType bar 出现

我们可以通过修改 textContentType 来实现 QuickType bar 的呈现,这是 iOS 10 新引入的一个属性,属于 UITextInputTraits 协议的一部分,UITextFieldUITextView 都遵守这个协议,通过修改这个属性我们可以让 iOS 提前知道用户会输入什么类型的内容,让文本补齐文本纠正更具有针对性。

swift // UITextInputTraits Protocol // 让 iOS 提前知道用户会输入什么类型的内容 optional var textContentType: UITextContentType! { get set }

UITextContentType 里有很多预设值可以满足我们的需求,例如昵称,地点,组织名,街道名字等等。在 iOS 11 里又引入了两个新的预设值。

struct UITextContentType {
    ...
    static let username: UITextContentType
    static let password: UITextContentType
}

适配密码自动填充功能很简单,只要把 UITextField 或者 UITextView 的 textContentType 为 .username.emailAddress 或者 .password 就可以了。除了通过代码修改,还可以通过 Interface Builder 进行设置。

如果 UITextFieldtextContentType 设置为 .password,即使没有把 isSecureTextEntry 设置 true,也会显示 QuickType bar。

在我们设置好 textContentType 之后,QuickType bar 确实显示出来了,但还没有显示相应的账户密码出来让用户选择,等一下我们再介绍如何显示登录信息出来,但看到这个标志,就意味着 iOS 已经准备好自动填充功能了。点击右边的钥匙 icon,就会弹出 Touch ID 验证。

验证完成后就会显示之前保存的密码,点选了其中一个账户密码之后就会自动填充上去了。

保证把登录信息正确的输入

适配须知

  • iOS 会自动填充 username 控件,以及 password 控件。
  • 即使你的 App 阻止 firstResponder 的修改,但打开密码列表的操作的优先级还是更高。
top Created with Sketch.