本机 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)

TextFieldSecureField

希望对你有帮助!

【讨论】:

【参考方案10】:

当我将键盘类型设置为“数字键盘”时,我在 React Native 中遇到了同样的问题。 由于info.plist 文件中设置的默认语言,这是本机 IOS 问题。

我在这里找到了解决方案:https://github.com/facebook/react-native/issues/27972

删除这两行以取消设置默认语言:

<key>CFBundleDevelopmentRegion</key>
<string>en</string>

您也可以将&lt;string&gt;en&lt;/string&gt; 修改为&lt;string&gt;fr&lt;/string&gt;,但是对于将切换到 azerty 键盘的英语用户,您将遇到同样的问题:/

【讨论】:

这是完美的解决方案。 在 React Native 上有同样的问题,但这并不能解决我的问题【参考方案11】:

就我而言,以下行解决了我的问题。

textField.textContentType = .newPassword

【讨论】:

以上是关于本机 UITextField 安全文本输入强制使用英语(美国)键盘的主要内容,如果未能解决你的问题,请参考以下文章

阻止 UITextField 安全文本清除现有文本

UIKeyboardTypeNumbersAndPunctuation 在具有安全文本输入的 UITextField 上被忽略

如何在Swift中切换UITextField安全文本条目(隐藏密码)?

如何在ios中组合使用密码点和普通文本的UITextField

只有大写的 UITextField Swift

强制 UITextView 光标到视图顶部