Autocorrection 是 iOS 中的一个内置机制,可在输入文本时自动纠正拼写错误。UIKit 通过 autocorrectionType 属性在 UITextInputTraits 协议中管理自动纠正的行为,支持三种模式:默认、启用和禁用。根据 Apple Text Programming Guide(2025),自动纠正基于系统词典和设备端机器学习分析输入的文本。对每个文本字段单独使用 autocorrectionType — 这允许根据输入数据的特性调整行为。
主要内容
Autocorrection(自动纠正)是 iOS 操作系统的一项功能,在检测到拼写错误时自动将输入的单词替换为可能是正确的变体。该机制在 UIKit 文本字段级别运行,并可在所有使用标准 UITextField 和 UITextView 输入元素的应用程序中使用。
自动纠正的基础是一个在数百万文本示例上针对每种支持语言训练的语言模型。该模型完全在设备端(on-device)运行,保证了输入数据的机密性 — 文本不会发送到 Apple 服务器进行分析。每次 iOS 更新时,模型都会得到优化并扩展新的单词和规则。
自动纠正会自动为所有文本字段激活,除非开发者明确禁用了它。用户可以在系统设置中完全禁用自动纠正(设置 > 通用 > 键盘 > 自动纠正),但开发者也可以通过 autocorrectionType 属性为单个字段管理此行为。
根据 WWDC 2023 Session 204,Apple 推出了基于 Transformer 的改进型自动纠正语言模型,该模型考虑整个句子的上下文,而不仅仅是最后一个单词。与之前基于 n-gram 的模型相比,这使虚假纠正的数量减少了 30%。
UITextAutocorrectionType 是一个具有三个值的枚举,用于确定特定文本字段的自动纠正行为。每个值通过 autocorrectionType 属性设置,该属性在 Interface Builder 和创建字段时的代码中可用。
.default 值表示该字段继承键盘系统参数中的全局自动纠正设置。此模式推荐用于大多数文本字段,因为它尊重用户的选择。如果用户在设置中禁用了自动纠正,使用 .default 的字段也不会使用它。
.yes 值强制为字段启用自动纠正,无论系统设置如何。此模式应仅用于拼写准确性至关重要的字段 — 例如,在文本编辑器、笔记或消息字段中。Apple 建议谨慎使用 .yes,因为强制启用可能与用户的期望相悖。
.no 值禁用特定字段的自动纠正。此模式对于密码字段(安全文本输入)、电子邮件地址、确认码和搜索查询是必需的。在这些字段中,自动纠正不仅无用,而且有害 — 它可能将正确输入的数据替换为错误的数据。
| 模式 | 值 | 建议 |
|---|---|---|
| .default | 继承系统设置 | 大多数输入字段 |
| .yes | 强制启用 | 文本编辑器、笔记 |
| .no | 强制禁用 | 密码、电子邮件、搜索、代码 |
iOS 自动纠正的语言模型使用静态词典和动态学习模型的组合。系统词典包含每种语言最常用的单词,基于 Transformer 的语言模型分析上下文和替换概率。该模型根据用户输入的文本在设备上学习。
用户可以通过键盘设置(设置 > 通用 > 键盘 > 文本替换)向个人词典添加单词。添加的单词保存在 iCloud 中,并通过相同的 Apple ID 在设备之间同步。系统不会纠正个人词典中的单词,这对于名称、品牌和技术术语非常方便。
对于特定领域 — 医学、法律、技术 — 标准词典可能包含不够的术语。在此类应用程序中,建议为相关字段禁用自动纠正,或通过 UIResponder 方法 .replacementDictionary(适用于 iOS 17+)使用自定义文本替换。
根据 Apple Machine Learning Research(2024),基于 Transformer 架构的新自动纠正模型可处理多达 10 个上下文标记(而之前的模型只有 3 个标记),从而更准确地确定用户意图。该模型不仅考虑拼写,还考虑句子的语法结构。
Safe Keyboard 是一种安全输入模式,对于 secureTextEntry = true 的字段会自动激活。在此模式下,无论设置的 autocorrectionType 值如何,系统都会禁用自动纠正、自动大写和预测输入。系统还会阻止对个人词典和文本替换的访问。
Safe Keyboard 可防止通过自动纠正机制泄露输入数据。如果自动纠正对密码字段处于活动状态,系统可能会将输入的密码保存在个人词典中,或将其发送到 Apple 服务器用于模型训练。Safe Keyboard 保证机密数据不会离开应用程序的范围。
对于金融应用程序,Safe Keyboard 仅对具有 secureTextEntry 的字段自动激活。对于卡号、有效期和 CVV 代码字段,开发者必须通过设置 autocorrectionType = .no 和 keyboardType = .numberPad 或 .phonePad 手动禁用自动纠正。
从 iOS 17 开始,Safe Keyboard 支持通过第三方键盘防止拦截。如果用户从 App Store 安装了键盘,当 secureTextEntry 激活时,系统键盘会自动替换第三方键盘,即使它被选为默认键盘。这确保了密码仅通过安全的系统键盘输入。
在 Swift 中管理自动纠正通过 UITextField 和 UITextView 对象的 autocorrectionType 属性进行。该属性可读可写,并可根据输入上下文动态更改。通过 Interface Builder 的配置在属性检查器中以名称 Correction 提供。
let textField = UITextField()
textField.autocorrectionType = .no
对于登录表单,应禁用密码字段的自动纠正,并为登录字段保留默认设置。电子邮件字段也建议不进行自动纠正,因为 @ 符号和域名经常被错误替换。对于用户名字段,如果用户名是可读的单词,则可以启用自动纠正。
class RegistrationViewController: UIViewController {
@IBOutlet var nameField: UITextField!
@IBOutlet var emailField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
nameField.autocorrectionType = .yes
emailField.autocorrectionType = .no
emailField.textContentType = .emailAddress
}
}
对于 UITextView,自动纠正的配置方式类似。这对于多行评论、消息和笔记字段尤为重要,在这些字段中自动纠正带来的好处最大,但在输入技术术语或代码时也可能造成不便。
let textView = UITextView()
textView.autocorrectionType = .default
要动态更改自动纠正,请使用 UITextFieldDelegate 委托。textFieldDidBeginEditing 方法在字段激活时被调用,在其中可以根据当前上下文或在应用程序运行期间可能变化的字段角色更改 autocorrectionType。
应禁用自动纠正 在输入数据准确性至关重要且系统无法正确确定用户意图的字段中。主要情况:密码和安全数据字段、电子邮件地址字段、搜索栏、代码和编程代码输入字段,以及具有非标准数据格式的字段。
对于搜索栏(UISearchBar),自动纠正默认禁用,这符合用户的期望。搜索时,用户可能输入不完整的单词、技术术语或不同语言的查询,自动纠正只会造成干扰。输入 URL 和域名时也是如此。
在即时通讯和通信应用程序中,自动纠正通常启用,但在输入俚语、缩写和非正式词汇时可能会造成不便。在这种情况下,用户可以通过键盘设置禁用自动纠正,或者开发者可以在应用程序界面中直接提供开关。
根据 Apple 的人机界面指南,对于任何输入数据可能不在系统词典中的字段,都应禁用自动纠正:订单号、预订代码、标识符、IMEI、MAC 地址。如果字段接受非标准格式的字母数字数据 — 请禁用自动纠正。
常见问题
应用程序没有全局禁用自动纠正的功能。需要为每个文本字段单独设置 autocorrectionType = .no,或创建具有覆盖值的 UITextField 子类。
模拟器使用 Mac 键盘的简化输入模型。模拟器中的自动纠正语言模型不活跃 — 测试时请使用真实设备。
用户可以通过设置 > 通用 > 键盘 > 文本替换添加单词。没有 API 可供应用程序以编程方式向系统自动纠正词典添加单词。
不会,keyboardType 不影响自动纠正。即使对于 .numberPad 键盘,自动纠正也可能处于活动状态,除非通过 autocorrectionType 明确禁用。
第三方键盘有自己的自动纠正机制,不使用系统的 UITextAutocorrectionType。行为取决于特定键盘的实现。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。