本文将介绍WWDC18 Automatic Strong Passwords and Security Code AutofillWWDC17 Introducing Password AutoFill for Apps中提到的几个功能: 密码自动填充/自动生成的强密码/验证码自动填充等.

如果需要更好的实现此功能,网站需要支持HTTPS,开发Demo可以用GitHub Pages.

在iOS11中,Apple已经做了启发式功能,可以让开发者在无感知的情况下,支持密码的快速填充,但是为了更好的用户体验和降低未来版本中可能出现的bug,建议对不同的功能做一些额外的步骤配置. 默认效果是这样的,QuickType Bar上没有关联域的账户密码可选

 
默认支持的效果

功能一: iOS11密码自动填充功能,账户密码在QuickBar中自动显示;iOS12自动保存密码到iCloud钥匙串

Infer login scenario
Check eligibility based on associated domains Find user name and password fields
Detect sign-in action
Prompt to save or update password

效果图

 
密码自动填充

工作原理

  • iOS会自动推断登录场景
  • 检查关联的域是否有效合格,从iCloud 钥匙串中筛选出符合的账户和密码显示在QuickType Bar
  • 根据设定输入框的textContentType类别,找到用户名和密码输入框,在用户点击QuickType Bar上的账户密码是填充到对应位置
  • 检测登录操作,在登录页面要从视图层次结构中移除的时候,提示是否保存/更新账户密码

开发人员需要配置的步骤

Associated Domains
设置UITextField的textContentType为对应类型

1.在苹果开发者后台开启APP的Associated Domains服务

 
苹果开发者后台APP配置

2.记录Prefix和app的BundleID,生成apple-app-site-association文件,放到关联域网站服务器的.well-known目录下面或者根目录下 . 注意:网站需要支持HTTPS,Demo中为了演示,可以把项目和个人的Github Pages关联,文件放到自己的Github Pages.

{
"webcredentials":{
"apps":["XW5558TH45.com.beike.testapp"]
}
}
 
网站设置:文件放到关联域的服务器

官方示例存放目录:

 
官方示例文件存放

3.Xcode中项目配置,开启Domains,点击"+"添加一项, webcredentials:后面的"coderxllau.github.io"改为自己关联的域,例如webcredentials:www.baidu.com

 
Xcode中项目配置

4.Xcode中除了开启并关联域,还需要更改输入框textContentType为指定类别

iOS 11和iOS 12中分别新增了新的Type.

UIKIT_EXTERN UITextContentType const UITextContentTypeUsername                  NS_AVAILABLE_IOS(11_0);
UIKIT_EXTERN UITextContentType const UITextContentTypePassword NS_AVAILABLE_IOS(11_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeNewPassword NS_AVAILABLE_IOS(12_0);
UIKIT_EXTERN UITextContentType const UITextContentTypeOneTimeCode NS_AVAILABLE_IOS(12_0);
self.userNameField.textContentType = UITextContentTypeUsername;
self.passwordField.textContentType = UITextContentTypePassword;

功能二: iOS12 自动生成建议的用户和强密码

效果图

 
自动生成强密码

工作原理/设置步骤

和功能一Password Autofill基本一样,不同的地方是在iOS 12中新增UITextContentTypeNewPassword,用这个字段标记新密码输入框即可在用户点击的时候自动生成强密码填充

self.nameField.textContentType = UITextContentTypeUsername;
if (@available(iOS 12.0, *)) {
self.passwordField.textContentType = UITextContentTypeNewPassword;
self.passwordField.passwordRules = [UITextInputPasswordRules passwordRulesWithDescriptor:@"required: lower; required: upper; allowe: digit; required: [-]; minlength: 5;"]; } else {
self.passwordField.textContentType = UITextContentTypePassword;
}
 
image.png

密码的格式

自动生成的密码,我们可以通过一些方法指定生成的密码格式和规则. 可以在官方提供的密码格式工具Password Rules Validation Tool上面调试自己的密码格式,将生成的密码格式描述复制下来,设置给UITextField的passwordRules属性.

if (@available(iOS 12.0, *)) {
self.passwordField.textContentType = UITextContentTypeNewPassword;
self.passwordField.passwordRules = [UITextInputPasswordRules passwordRulesWithDescriptor:@"required: lower; required: upper; allowe: digit; required: [-]; minlength: 5;"];
}
 
密码生成格式规则
 
IB中设置密码生成格式

功能三: iOS12 自动填充验证码

效果图 , 从短信中获取到验证码后自动显示到QuickType Bar上

 
验证码自动识别

工作原理

在输入框成慰第一响应者的时候,使用数据检测器启发式来推断传入消息携带安全代码,把检测到验证码显示到QuickType Bar上,省去用户的操作成本

缺陷:在demo中可以看到,自如发来的验证码也可以被demo获取,对于验证码来源没有做到很好的隔离

开发步骤:

开发步骤和功能一基本一致,在完成功能一的基础上面,设置输入框的输入类别为UITextContentTypeOneTimeCode即可.

注意点

  • 您应避免在视图层次结构中构建定制键盘UI,或在控件中设置自定义输入视图。因为如果您这样做,则会阻止iOS显示必要的UI或注入相应的事件以代表您的用户键入代码。
  • 关联的网站要支持HTTPS
  • 标记textContentType的输入框独立开,不要用一个输入框标记两个类别
  • 验证码来源没有做到很好的隔离

参考资料

WWDC18 Automatic Strong Passwords and Security Code Autofill
WWDC17 Introducing Password AutoFill for Apps;


 

iOS - WWDC18 iOS 自动生成强密码和自动填充验证码/密码的更多相关文章

  1. 【Golang】基于录制,自动生成go test接口自动化用例

    背景 之前写过一篇博客,介绍怎么用Python通过解析抓包数据,完成自动化用例的编写.最近这段时间在使用go test,所以就在想能不能也使用代码来生成自动化用例,快速提升测试用例覆盖率.说干就干. ...

  2. Abator自动生成ibatis的相关配置和类

      一.abator自动生成配置: abator自动生成ibatis的配置文件.mode.sqlMap.dao.bean实例 准备: 1.安装Eclipse插件:      要求eclipse3.1, ...

  3. SpringBoot系列——Spring-Data-JPA(究极进化版) 自动生成单表基础增、删、改、查接口

    前言 我们在之前的实现了springboot与data-jpa的增.删.改.查简单使用(请戳:SpringBoot系列——Spring-Data-JPA),并实现了升级版(请戳:SpringBoot系 ...

  4. 自动生成SSM框架

    使用idea 新创建项目 然后 新创建 java .resources 文件夹...... 图上是项目结构 java文件夹下的 文件夹 命名规范 com.nf147(组织名)+ oukele(作者) ...

  5. json 对c++类的序列化(自动生成代码)

    [动机] 之前写网络协议的时候,使用的是google protobuf,protobuf不但在性能和扩展性上有很好的优势,protoc自动生成c++类代码的工具,这点确实给程序员带来了很多便利. 做后 ...

  6. hibernate中.hbm.xml和注解方式自动生成数据表的简单实例(由新手小白编写,仅适用新手小白)

    绝逼新手小白,so 请大神指点! 如果真的错的太多,错的太离谱,错的误导了其他小伙伴,还望大神请勿喷,大神请担待,大神请高抬贵嘴......谢谢. 好了,正题 刚接触ssh,今天在搞使用.hbm.xm ...

  7. 使用Excel自动生成sql语句

    在近一段日子里,进入了新的项目组,由于项目需要,经常要将一些Excel表中的数据导入数据库中,以前并没有过多的接触过数据导入与数据处理,对于我来说比较痛苦,今天下午花了几个小时处理数据,但是同事给我提 ...

  8. 如何使用ThinkPHP5 ,自动生成目录?

    具体步骤: A.在build.php中按照实际需求修改定义模块的内容: B.修改Public/index.php,在代码中加入: // 读取自动生成定义文件 $build = include '/.. ...

  9. 工具——代码中自动生成SVN版本号

    本节和大家讨论一下程序集版本最后一位使用SVN版本号的自动生成方法,这里就向大家简单介绍一下.在进行自动部署的时候,经常需要用脚本获取程序的最新版本号.现在我们定义每个程序集的版本信息的最末段表示SV ...

随机推荐

  1. 基于hive的《反贪风暴4》的影评

    一:将爬虫大作业产生的csv文件上传到HDFS 查看文件中前10条信息,即可证明是否上传成功. 二.对CSV文件进行预处理生成无标题文本文件 创建一个deal.sh,主要实现数据分割成什么样的意思 执 ...

  2. Phpoffice 已经弃用

      Package phpoffice/phpexcel is abandoned, you should avoid using it. Use phpoffice/phpspreadsheet i ...

  3. Python17个常用内置模块总结

    Python17个常用内置模块总结 1.getpass 2.os 3.sys 4.subprocess 5.hashlib 6.json 7.pickle 8.shutil 9.time 10.dat ...

  4. HTTP、MQTT、Websocket、WebService区别

    相同点: HTTP.MQTT.Websocket均为OSI 7层模型的[应用层协议]注意. WebService并非通信协议,而是一种远程接口调用(RPC)的框架技术. 不同点: MQTT MQTT协 ...

  5. RSA前台加密后台解密

    RSA解密时BadPaddingException java rsa 解密报:javax.crypto.BadPaddingException: Decryption error Java安全架构__ ...

  6. Qt布局 tab-widget-layout

    QHBoxLayout *horizontalLayout_6 = new QHBoxLayout(main_ui.tab_5); horizontalLayout_6->setSpacing( ...

  7. 2-3 【初识组件】顶部 TabBar

    VsCode中使用Emmet神器快速编写HTML代码 1 根组件下面包含了很多的子组件 组件就是控制屏幕的某一个部分,某一个区域 组件是可以相互包含的 组件是定义在类里面的,类里面有属性和方法 注解会 ...

  8. Laya微信小游戏的动态资源

    版本2.1.1. 由于有4m包限制,所以一般小游戏项目分成主包+远程资源. 现在我新建一个remote目录,该目录下资源不发布到微信小游戏目录下,而是服务器远程加载. 发布时,勾线是否提取本地包 远程 ...

  9. Java 8 stream 经典示例

    package org.study2.java8.stream; import org.junit.Test; import java.util.*; import java.util.stream. ...

  10. [LeetCode] 278. First Bad Version 第一个坏版本

    You are a product manager and currently leading a team to develop a new product. Unfortunately, the ...