iOS验证码自动填充失效:设置.oneTimeCode后无法识别SMS验证码
我自定义了继承自UITextField的MaskedTextField用于接收一次性验证码,代码如下:
let codeTextField: MaskedTextField = { // inherits from UITextField let textField = MaskedTextField() textField.textContentType = .oneTimeCode textField.textColor = .mineShaft textField.tintColor = .mineShaft textField.autocapitalizationType = .none textField.placeholderCharacter = "_" textField.patternMask = "___ ___" textField.autocorrectionType = .no textField.keyboardType = .numberPad textField.font = UIFont.poppinsMedium.withSize(17) textField.placeholder = "settings.code.title".localized return textField }()
但收到短信验证码后,该输入框的自动填充功能并未生效,收到的短信内容如下:
Verification code to PLZ from 12-10-2023 14:33:20. SMS code: 678826
@partner-portal.pre-prod.plz.pl #678826
可能的原因及解决建议
原因1:掩码格式冲突
输入框设置了patternMask = "___ ___",将6位验证码拆分为3+3的分段格式。iOS的一次性验证码自动填充基于完整的验证码匹配逻辑,分段掩码会让系统无法识别输入框可接收完整的6位验证码,从而导致填充失败。
解决建议:
- 先移除
patternMask配置,测试原生UITextField是否能正常自动填充,确认是否为掩码导致的问题。 - 若需要保留分段显示,改用多个独立的UITextField(例如两个3位输入框),每个都设置
contentType = .oneTimeCode,系统会自动完成填充。
原因2:自定义TextField兼容性问题
MaskedTextField作为UITextField的子类,若重写了text属性或shouldChangeCharactersIn等输入处理方法,可能破坏了原生oneTimeCode contentType的识别逻辑,拦截了系统的自动填充事件。
解决建议:
- 检查自定义MaskedTextField的代码,注释掉输入限制、文本格式化等自定义逻辑,测试自动填充是否恢复正常。
- 若必须保留自定义逻辑,确保在处理输入时不对系统自动填充的内容做拦截,允许完整的验证码字符串输入后再进行分段格式化。
原因3:关联域名不匹配
短信中的@partner-portal.pre-prod.plz.pl需要与App配置的关联域名完全匹配。若苹果开发者后台未配置对应的关联域名,或Info.plist中associated-domains条目不正确,系统无法识别该短信属于当前App,不会触发自动填充。
解决建议:
- 登录苹果开发者后台,检查App的
Associated Domains配置,确保添加了applinks:partner-portal.pre-prod.plz.pl(或对应类型的域名标识)。 - 核对App的Info.plist文件,确认
associated-domains条目包含上述域名,同时相关网络配置允许该域名的访问。
原因4:输入规则拦截
虽然设置keyboardType = .numberPad本身没问题,但如果自定义TextField限制了输入字符的数量或格式,可能在系统自动填充时直接拦截了内容输入。
解决建议:
- 检查自定义代码中是否有字符长度限制,确保允许6位数字完整输入后再进行分段处理。
- 测试在关闭掩码逻辑的情况下,输入框是否能正常接收6位数字的自动填充。
内容的提问来源于stack exchange,提问作者kunass2

