本机 UITextField 安全文本输入强制使用英语(美国)键盘
Posted
技术标签:
【中文标题】本机 UITextField 安全文本输入强制使用英语(美国)键盘【英文标题】:Native UITextField Secure Text Entry forces English (US) keyboard 【发布时间】:2019-03-13 01:25:24 【问题描述】:我有一个非常简单的登录页面(登录名 + 密码)。
我的用户是法国人,所以他们的键盘是法语 (azerty)。
从 ios 12 开始,当他们单击受保护的密码文本字段时,即使他们的设备上没有安装此键盘,键盘也会切换为英语 (qwerty)。此外,如果他们没有安装此键盘,他们将无法切换回他们的键盘。
我发现如果我停用安全文本输入,问题不会出现。
我还尝试以编程方式设置 isSecureTextEntry,但出现了错误。
我正在添加两个屏幕截图,每个文本字段一个。
非常感谢您的时间和帮助。
【问题讨论】:
我也有这个问题。这绝对是 iOS 12 的错误。希望他们尽快修复它。 谢谢。我完全同意,但是我在其他任何地方都找不到这个问题的任何其他痕迹,你可以吗? 您是否从设备设置中添加了法语键盘? 法文键盘是我的默认键盘,因为我的 iPhone 是法文并以这种方式初始化,所以是的,它已安装 :) @imacode 是的!这也正是我的问题。我在 45 天前通过 Bug Reporter 向 Apple 提交了一份错误报告,目前没有消息。 【参考方案1】:斯威夫特 3:
使用 languageCode 和 textInputMode 为 UITextField 创建基类。
class BaseTextField: UITextField
// ru, en, ....
var languageCode: String?
didSet
if self.isFirstResponder
self.resignFirstResponder();
self.becomeFirstResponder();
override var textInputMode: UITextInputMode?
if let language_code = self.languageCode
for keyboard in UITextInputMode.activeInputModes
if let language = keyboard.primaryLanguage
let locale = Locale.init(identifier: language);
if locale.languageCode == language_code
return keyboard;
return super.textInputMode;
用法:
将您的值 (ru, en, ...) 设置为 languageCode。它将强制更改键盘中的区域设置。
private func textConfigure(textField: UITextField)
textField.keyboardType = .default
textField.autocapitalizationType = .words
textField.languageCode = "ru"
希望能帮到你。
【讨论】:
keyboardType = .decimalPad 不能显示点或逗号【参考方案2】:这确实是一个 iOS 错误 => 在 iOS 12.1 中更正
【讨论】:
我们在 iOS 12.1 上仍然存在问题 我们在 iOS 12.1.1 上也有这个问题 还在,iOS 12.2 在 iOS 13+ 中仍然存在 在 iOS 14+ 中仍然存在【参考方案3】:我有同样的问题,在我的情况下,这个错误只出现在注册屏幕上。
原因是 Apple 检查类/函数/参数的名称以确定(使用启发式)它是否是登录/注册屏幕并自动激活自动填充密码。 通过在我的代码中将“register”替换为“Patate”,问题就解决了。
我使用带有 2 个文本字段(带有安全文本条目)和一个名为“RegisterViewController”的视图控制器的示例应用程序重现了这个问题。使用“PatateViewController”,我没有问题。
此外,我在控制台中有此错误: [自动填充] 无法显示应用 bundleID 的自动强密码:*** 由于错误:iCloud 钥匙串已禁用
来源:https://developer.apple.com/documentation/security/password_autofill
希望您能找到比重命名代码更好的方法。
【讨论】:
我赞成,“PatateViewController”显然是你可以给 ViewController 起的更好的名字?【参考方案4】:我最近在我们的应用程序中出现了同样的问题。 该问题与 Apple 的 PasswordAutofill 的新功能有关。
要绕过这个问题,您可以在安全文本字段上应用这段代码
if #available(iOS 12.0, *)
tfPassword.textContentType = .oneTimeCode
这应该可以解决这个错误。 这也应该解决这个错误:
[AutoFill] 无法显示应用 bundleID 的自动强密码:*** 由于错误:iCloud 钥匙串已禁用
Ps:您也可以将此新功能添加到您的应用中。 这是一篇文章的链接,该文章解释了如何实现此新功能的过程 Explanation on how to implement password autofill
希望对你有帮助。
【讨论】:
这是我的解决方案 当用户禁用其钥匙串时,错误仍然出现 在 swiftUI 中相同,只需将 .textContentType(.oneTimeCode).keyboardType(.default) 添加到 SecureField【参考方案5】:iOS 12.1 为我解决了这个问题。
您还必须将密码文本字段的参数textContentType
设置为.oneTimeCode
【讨论】:
这并不能解决我的应用程序的问题。在 iOS 12.1.2 上运行【参考方案6】:遇到同样的问题并通过将 all 我的 textFields textContentType
属性设置为 UITextContentType.oneTimeCode
来解决它。
当然,oneTimeCode
现在无用了,因为它无处不在...
【讨论】:
我正面临这个问题...***.com/questions/61495065/…【参考方案7】:错误越糟糕,解决方案就应该越糟糕,我的意思是 Apple 的工作多么糟糕。
我的解决方案是强制关注密码字段,然后关注第一个字段,在我的例子中是 usernameField。
- (void) viewDidAppear:(BOOL)animated
[super viewDidAppear:animated];
[self.passwordTextField becomeFirstResponder];
[self.usernameTextField becomeFirstResponder];
【讨论】:
【参考方案8】:以防万一,我通过简单地将其添加到我的主 viewController 来纠正这个问题:
func passwordSignUpViewController(forAuthUI authUI: FUIAuth, email: String, requireDisplayName: Bool) -> FUIPasswordSignUpViewController
return CustomPasswordSignUpViewController(authUI: authUI, email: email, requireDisplayName: true)
我创建了 FUIPasswordSignUpViewController 的子类
import Foundation
import FirebaseUI
class CustomPasswordSignUpViewController : FUIPasswordSignUpViewController, UITextFieldDelegate
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?, authUI: FUIAuth, email: String?, requireDisplayName: Bool)
super.init(nibName: "FUIPasswordSignUpViewController", bundle: nibBundleOrNil, authUI: authUI, email: email, requireDisplayName: requireDisplayName)
required init?(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
override func viewDidLoad()
super.viewDidLoad()
func textFieldDidBeginEditing(_ textField: UITextField)
if #available(iOS 12.0, *)
textField.textContentType = .oneTimeCode
【讨论】:
【参考方案9】:现在 Swiftui 中的解决方案相同:
TextField("placeholder",text: $YourTextBinding)
.textContentType(.oneTimeCode)
.keyboardType(.default)
只需要添加:
.textContentType(.oneTimeCode)
.keyboardType(.default)
到TextField
或SecureField
。
希望对你有帮助!
【讨论】:
【参考方案10】:当我将键盘类型设置为“数字键盘”时,我在 React Native 中遇到了同样的问题。
由于info.plist
文件中设置的默认语言,这是本机 IOS 问题。
我在这里找到了解决方案:https://github.com/facebook/react-native/issues/27972
删除这两行以取消设置默认语言:
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
您也可以将<string>en</string>
修改为<string>fr</string>
,但是对于将切换到 azerty 键盘的英语用户,您将遇到同样的问题:/
【讨论】:
这是完美的解决方案。 在 React Native 上有同样的问题,但这并不能解决我的问题【参考方案11】:就我而言,以下行解决了我的问题。
textField.textContentType = .newPassword
【讨论】:
以上是关于本机 UITextField 安全文本输入强制使用英语(美国)键盘的主要内容,如果未能解决你的问题,请参考以下文章
UIKeyboardTypeNumbersAndPunctuation 在具有安全文本输入的 UITextField 上被忽略
如何在Swift中切换UITextField安全文本条目(隐藏密码)?