在iOS 12中自动生成的密码

如果您的应用程序具有注册功能,其中包括能够输入新用户名和密码的能力或需要,那么您很可能会对iOS 12的创新感兴趣,我将对此进行概述。 这是一项为用户发明新密码,自动将其替换为必要字段并将其安全存储在Keychain中的服务

系统密码自动生成对选择的抵抗力最大(是随机生成的字符序列-已针对自定义限制进行调整,但稍后会进行更多说明),使应用程序用户免于提出自己的序列号的需求,并可以根据特定应用程序的需要灵活配置。 很容易提供对新功能的支持,但是并非没有功能。 但是首先是第一件事。

权利与义务


首先,应用程序必须声明其使用此功能的愿望。 在相应目标功能列表中首先必须在“ 关联域”列表中具有一个域。 奇怪的是,该应用程序必须具有“关联域”才能使用生成的密码并将其存储在用户的“钥匙串”中(这两个功能是相互关联的,并且生成不能与存储分开使用)。

如果该应用程序已经支持在您的站点上使用共享帐户(所谓的“共享凭据”) ,则此步骤已经落后。 如果应用程序支持通用链接或其他用于处理外部“ URL”的机制,它可能也已经落后了。

无论如何,添加此兼容性后,应用程序将具有新的“权利”

除了这种更广泛的兼容性之外,应用程序还应该具有“功能” “自动填充凭据提供程序” -这允许应用程序在用户许可下使用系统提供的登录名和密码。 添加此兼容性将导致出现“ 自动填充凭据提供者权利”权限。
顺便说一句,此功能和其他功能的添加仅适用于Apple Developer Program的成员。
应用程序使用的配置配置文件还必须包括以下两个功能。

使用的依赖


添加适当的兼容性将导致AuthenticationServices 框架出现在相应目标的“链接框架和库”列表中。 这一点值得一提。

首先,相关框架的自动添加可能不是第一次“起作用”:当我从“ Xcode”版本10.1的副本中在真实设备上启动应用程序时,由于缺少“ AuthenticationServices”,应用程序立即“崩溃”。 手动删除框架并将其添加回相关组件列表即可解决此问题。

其次,自动添加框架会将其标记为“必需”。 如果您的应用程序暗示有可能在低于12的“ iOS”版本下工作,那么这也将导致它在启动阶段从较低版本的“操作系统”下崩溃。 “ AuthenticationServices”仅适用于版本12系统。 通过将框架标记为“可选”可以解决此问题。

文字框支持


为了支持文本字段的功能, UITextInputTraits textContentType协议的变量textContentTypeUITextField类(最有可能用于在应用程序中输入登录名和密码)已经实现了我们所需协议的要求。

textContentTypeUITextContentType类型的字段,仅包含一组常量。 目前,我们需要的是newPassword ,用于输入当前发明的新密码(不要与仅用于输入现有密码的password相混淆)。

 let passwordTextField = UITextField() if #available(iOS 12, *) { passwordTextField.textContentType = .newPassword } 

设置textContentType的值包含在“ API”可访问性检查中,因为与常规功能一样,此常量仅从“ iOS 12”开始可用。

除了内容类型,文本字段还必须提供安全的数据输入:

 passwordTextField.isSecureTextEntry = true 

尽管该应用程序可能很好地提供了显示和隐藏当前流行的输入密码的功能,但是只有当此刻标志为true ,才提供生成的密码。

有趣的一点是与文本字段的内容类型有关:如果屏幕上没有其他字段,而内容类型为username ,则不会提供自动生成的密码。 这是由于该功能不仅基于文本字段内容的指定类型,而且还基于屏幕内容启发式分析

密码生成似乎“破坏”了需要两次输入新密码进行验证的屏幕逻辑。 至少我还没有找到同时使用这两个功能的方法。 看来我不是唯一的一个

值得一提的是,如果登录名从语义上来说是一个电子邮件地址(因此,我真的很想拥有合适的键盘类型 ),则可以将键盘和内容的类型组合在一起:

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

密码要求


通常,用户密码必须遵循某些规则(具有一定的长度,包括某些字符等)。 可以指定这些规则,以便系统在生成密码时将它们考虑在内。 这是通过UITextInputTraits协议的passwordRules属性完成的。 例如:

 if #available(iOS 12, *) { passwordTextField.passwordRules = UITextInputPasswordRules(descriptor: "required: upper; required: lower; required: digit; minlength: 8;") } 

该属性也仅从“ iOS 12”开始可用。

该属性的类型为UITextInputPasswordRules 。 初始化-使用描述符字符串。 该句柄具有简单的语法,并且由简单的密码要求组成,并以分号列出。 每个需求都是一个键值对,以冒号分隔。 关键字是规则的类型(例如,“必须包含” required ),值是必须遵循此规则的元素(例如,digits- digit )。

在上面的示例中,描述符表示:

  • required: upper至少存在一个大写字母;
  • required: lower -至少一个小写字母相同;
  • required: digit -至少一个小写数字相同;
  • minlength: 8最小长度为八个字符。

在NSHipster网站上发表的一篇不错的文章中,可以找到可能的键和值的详细列表。

苹果提供了一个相当方便的描述符编译助手 ,它不仅提供了一种方便的构造方法,而且还提供了无限制生成示例形式的已编译描述符检查。 在那里,您可以看到默认应用了哪些规则。

验证方式


为了以防万一,应澄清密码生成机制不提供对用户输入数据的验证-您需要自己进行维护。 当然,这是很合逻辑的,因为 应用程序用户可以拒绝建议的自动生成的密码,甚至禁止生成密码和自动完成字段。

界面构建器


值得注意的是,按照我们的时代精神,所有列出的文本字段设置都可以在“接口生成器”中设置 ,最高可以设置为“密码规则”:

图片

功能检查


该功能并不复杂,但有许多细微差别:配置它时,您很容易忘记一些东西。 在这种情况下,在“调试”程序集中,当激活相应的文本字段时,原因将在控制台中显示该功能当前不起作用的原因。

例如:

 [AutoFill] Cannot show Automatic Strong Passwords for app bundleID: <...> due to error: Cannot save passwords for this app. Make sure you have set up Associated Domains for your app and AutoFill Passwords is enabled in Settings 

另外,您应始终牢记,此类功能属于需要用户许可的操作。 在这种情况下,需要两个:

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

结论


在提供对新功能的支持时,这似乎是所有应注意的方面。 如果在此过程中有人遇​​到了其他有趣的功能,我将发表评论,并在必要时确保对本文进行补充。

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

Source: https://habr.com/ru/post/zh-CN438580/


All Articles