iOS 12 在系统中文键盘上使用 AutoFill 会遇到诡异的问题以及解决方案

简介: iOS 12 在系统中文键盘上使用 AutoFill 会遇到诡异的问题以及解决方案

感谢我们 iOS 团队的赵恒、刘家飞发现此 bug。

image.png

码农的桌面.jpg


一. 问题描述



首先,创建一个 textField,使用 addTarget 函数来监听 textField 的 editingChanged 事件。


lazy var textField: UITextField = {
    let tf = UITextField()
    tf.keyboardType = .numberPad
    tf.textAlignment = .center
    tf.addTarget(self, action: #selector(valueChange(textField:)), for: .editingChanged)
    return tf
  }()
  @objc func valueChange(textField:UITextField)
{
    print("------value change---  \(textFiled.text)  ----")
    if (textFiled.text?.count == 6)
    {
        //do something 和服务器通讯验证用户输入的验证码是否正确
    }
}


如果系统升级到最新的 iOS 12.0,并结合系统中文键盘使用 AutoFill (自动识别短信验证码)的功能,就会发现 valueChange 函数中 "do something" 的这段代码被调用了三次


在 iOS 12 设备上使用系统的中文(简体)键盘或者中文(繁体)键盘会打印出以下 log


------value change---  Optional("123456")  ----
------value change---  Optional("123456")  ----
------value change---  Optional("")  ----
------value change---  Optional("1")  ----
------value change---  Optional("12")  ----
------value change---  Optional("123")  ----
------value change---  Optional("1234")  ----
------value change---  Optional("12345")  ----
------value change---  Optional("123456")  ----


再测试一下系统其他语言的键盘,例如 英文(美国)键盘或者日文键盘,打印出来的 log


------value change---  Optional("")  ----
------value change---  Optional("1")  ----
------value change---  Optional("12")  ----
------value change---  Optional("123")  ----
------value change---  Optional("1234")  ----
------value change---  Optional("12345")  ----
------value change---  Optional("123456")  ----

由此,得出以下结论:

在系统中文键盘上 editingChanged 事件会莫名地多执行两次

使用 RxSwift 会得到同样的结论,下面是使用 RxSwift 的代码片段:


textField.rx.text.orEmpty
.subscribe(onNext: { text in
    let count = text.count
    if count == 6 {
      //do something 和服务器通讯验证用户输入的验证码是否正确
    }
})
.disposed(by: bag)

二. bug report

image.png

提交issue.PNG

image.png

提交完成.PNG


三. 解决方案



使用 UITextFieldDelegate 来代替原先 editingChanged / RxSwift 的监听事件,具体解决的代码片段如下:


func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        if range.location == 5 {
            var text = ""
            if let tfText = textField.text {
                text = tfText + string
            }
            if text.count == 6 {
                //do something 和服务器通讯验证用户输入的验证码是否正确
            }
        }
        return true
    }


相关文章
|
17天前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
13天前
|
安全 数据安全/隐私保护 Android开发
深入探索iOS系统安全机制:从基础到高级
本文旨在全面解析iOS操作系统的安全特性,从基础的权限管理到高级的加密技术,揭示苹果如何构建一个既开放又安全的移动平台。我们将通过实例和分析,探讨iOS系统如何保护用户数据免受恶意软件、网络攻击的威胁,并对比Android系统在安全性方面的差异。
|
19天前
|
安全 搜索推荐 Android开发
揭秘安卓与iOS系统的差异:技术深度对比
【10月更文挑战第27天】 本文深入探讨了安卓(Android)与iOS两大移动操作系统的技术特点和用户体验差异。通过对比两者的系统架构、应用生态、用户界面、安全性等方面,揭示了为何这两种系统能够在市场中各占一席之地,并为用户提供不同的选择。文章旨在为读者提供一个全面的视角,理解两种系统的优势与局限,从而更好地根据自己的需求做出选择。
49 2
|
28天前
|
安全 搜索推荐 Android开发
深入探索安卓与iOS系统的差异及其对用户体验的影响
在当今的智能手机市场中,安卓和iOS是两大主流操作系统。它们各自拥有独特的特性和优势,为用户提供了不同的使用体验。本文将深入探讨安卓与iOS系统之间的主要差异,包括它们的设计理念、用户界面、应用生态以及安全性等方面,并分析这些差异如何影响用户的使用体验。
|
27天前
|
安全 搜索推荐 Android开发
揭秘iOS与Android系统的差异:一场技术与哲学的较量
在当今数字化时代,智能手机操作系统的选择成为了用户个性化表达和技术偏好的重要标志。iOS和Android,作为市场上两大主流操作系统,它们之间的竞争不仅仅是技术的比拼,更是设计理念、用户体验和生态系统构建的全面较量。本文将深入探讨iOS与Android在系统架构、应用生态、用户界面及安全性等方面的本质区别,揭示这两种系统背后的哲学思想和市场策略,帮助读者更全面地理解两者的优劣,从而做出更适合自己的选择。
|
18天前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。
|
20天前
|
安全 Android开发 iOS开发
安卓系统与iOS系统的比较####
【10月更文挑战第26天】 本文将深入探讨安卓(Android)和iOS这两大主流移动操作系统的各自特点、优势与不足。通过对比分析,帮助读者更好地理解两者在用户体验、应用生态、系统安全等方面的差异,从而为消费者在选择智能手机时提供参考依据。无论你是技术爱好者还是普通用户,这篇文章都将为你揭示两大系统背后的故事和技术细节。 ####
39 0
|
iOS开发
iOS调用系统通讯录
iOS调用系统通讯录
224 0
iOS调用系统通讯录