在iOS 12中生成的密码

(本文最初是用俄语撰写的,并在此处发布。)

如果您的应用程序进行了注册,包括可能甚至需要输入新的用户名和密码,那么您很可能会对这一全新的iOS 12功能感兴趣-该服务为用户组成了新密码,并自动在其中填写文本字段并将它们安全地存储在钥匙串中。

生成的密码对暴力搜索的抵抗力最大(因为它们是随机生成的符号序列-尽管具有可自定义的限制,这将在后面讨论),从而可以避免用户自己发明此序列,并且可以针对具体情况灵活设置任务。 此功能支持很容易获得,但是并非没有特殊之处。 让我们进行讨论。

权利与责任

首先,应用程序必须声明其打算使用该功能。

相应目标的功能列表必须具有关联的域。 奇怪的是,这对于使用生成的密码并将其存储在用户的钥匙串中是强制性的。 这两个功能是相互绑定的,生成不能与存储分开使用。

如果应用程序已支持共享凭据,则说明您已经落后了。 如果应用程序支持通用链接或其他处理外部URL的方法,则可能已经完成。

无论如何,在应用程序具有此功能之后,它将获得新的权利。

除此之外,更常见的功能是应用程序必须打开“自动填充凭据提供程序”功能-它允许具有用户权限的应用程序使用系统用户名和密码建议的功能。 启用此功能后,将添加“自动填充凭据提供程序权利”。

顺便说一下,所有描述的功能仅适用于Apple Developer Program成员。

当前的临时配置文件还必须包括这两个项目。

依存关系

之后,添加了两个功能,一个框架将被添加到相应目标的“链接框架和库”列表中-AuthenticationServices。 有几点要考虑。

首先,不加窥视可能无法自动添加链接框架。 在真实设备上启动并在Xcode 10.1上运行后,我的应用崩溃了,无法找到AuthenticationServices。 手动删除和添加解决了该问题。

其次,自动添加将该框架标记为必需。 如果您计划支持低于12的iOS版本,则会在iOS <12上启动时导致崩溃(从iOS 12开始提供AuthenticationServices)。 通过将此依赖性标记为Optional可以解决此问题。

支持文本字段

UITextInputTraits协议的变量textContentType用于此目的。 最有可能用于相应输入的UITextField类已符合该协议。

textContentTypeUITextContentType类型的属性,该属性仅包含一组常量。 我们需要一个名为newPassword密码,用于输入新密码(不要与现有密码输入的password混淆):

 让passwordTextField = UITextField() 
 如果#available(iOS 12,*){ 
passwordTextField.textContentType = .newPassword
}

从iOS 12开始,可以使用此常数以及整个功能。 这就是使用API​​可用性检查的原因。

除此之外,文本字段必须启用安全输入:

  passwordTextField.isSecureTextEntry = true 

尽管某个应用可能支持当前流行的“显示/隐藏”密码功能,但只有当该标志为true时,才会生成新密码。

有一件有趣的事。 如果在同一屏幕上没有username内容类型的文本字段,则也不会生成新密码。 原因是该功能不仅支持文本字段内容类型,还支持屏幕内容的启发式分析。

还有一件事是,密码生成打破了需要两次输入新密码的屏幕逻辑。 至少我还没有找到一种利用这两种功能的方法。 看来,我并不孤单。

还值得一提的是,文本字段的键盘和内容类型可能以不同的方式组合在一起。 例如,此代码将文本字段设置为具有电子邮件键盘类型和用户名内容类型:

 让userNameTextField = UITextField() 
userNameTextField.keyboardType = .emailAddress
userNameTextField.textContentType = .username

密码要求

通常,密码必须满足某些要求,例如一定的最小长度或两个字母都包含在内。 系统可以考虑此要求。 UITextInputTraits协议的passwordRules属性提供了这种可能性:

 如果#available(iOS 12,*){ 
passwordTextField.passwordRules = UITextInputPasswordRules(描述​​符:“必填:上限;必填:下限;必填:数字;最小长度:8;”)
}

该属性的类型为UITextInputPasswordRules并使用描述符字符串进行了初始化。 描述符具有简单的语法,并且可以由用分号分隔的一组简单规则组成。 每个规则都是一个键值对,中间有一个冒号。 键是规则类型,值是必须遵循该规则的字符类型。

上面的示例订购了密码:

  • 至少包含一个大写字母;
  • 至少包含一个小写字母;
  • 至少包含一位数字;
  • 长度至少为八个字符。

例如,可以在NSHipster上的这篇不错的文章中找到所有受支持规则的详细列表。

同时,Apple为描述符起草提供了一个非常方便的助手,这似乎是构造描述符的好方法,并且是测试描述符的原始方法(通过生成密码的数量不受限制)。 同一网页显示默认应用哪些规则。

验证方式

万一值得一提的是,密码生成没有实现任何验证-这应该单独进行。 而且我相信,这是可以预期的,因为用户始终能够拒绝建议的自动生成的密码,甚至可以禁用整个功能以及自动填充字段。

Interface Builder支持

值得注意的是(并与时俱进)所有提到的文本字段设置都可以在Interface Builder中设置,甚至密码规则也可以:

功能测试

该功能并不复杂,但是有一些微妙之处:一个很容易忘记某些东西。 幸运的是,在这种情况下,在调试版本中,如果功能损坏并且相应的文本字段已激活,则将故障的确切原因打印到控制台。 例如:

  [自动填充]由于错误而无法显示应用程序bundleID:的自动强密码:无法保存该应用程序的密码。 确保已为您的应用设置关联域,并且在“设置”中启用了“自动填充密码” 

还应记住,此功能是需要用户许可的功能之一。 更准确的说,有两个权限:

  1. iCloud钥匙串;
  2. 自动填充。

结论

看来,这就是必须考虑的全部! 如果有人在这个话题上有什么要分享的,请随时发表评论(并在Twitter上关注我),我将补充本教程。

该功能非常有趣,正确使用它可以改善您的应用程序用户体验。