【问题标题】:Native UITextField Secure Text Entry forces English (US) keyboard本机 UITextField 安全文本输入强制使用英语(美国)键盘
【发布时间】:2019-03-13 01:25:24
【问题描述】:

我有一个非常简单的登录页面(登录名 + 密码)。

我的用户是法国人,所以他们的键盘是法语 (azerty)。

从 iOS 12 开始,当他们单击受保护的密码文本字段时,即使他们的设备上没有安装此键盘,键盘也会切换为英语 (qwerty)。此外,如果他们没有安装此键盘,他们将无法切换回他们的键盘。

我发现如果我停用安全文本输入,问题不会出现。

我还尝试以编程方式设置 isSecureTextEntry,但出现了错误。

我正在添加两个屏幕截图,每个文本字段一个。

非常感谢您的时间和帮助。

【问题讨论】:

  • 我也有这个问题。这绝对是 iOS 12 的错误。希望他们尽快修复它。
  • 谢谢。我完全同意,但是我在其他任何地方都找不到这个问题的任何其他痕迹,你可以吗?
  • 您是否从设备设置中添加了法语键盘?
  • 法文键盘是我的默认键盘,因为我的 iPhone 是法文并以这种方式初始化,所以是的,它已安装 :)
  • @imacode 是的!这也正是我的问题。我在 45 天前通过 Bug Reporter 向 Apple 提交了一份错误报告,目前没有消息。

标签: ios swift keyboard uitextfield


【解决方案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 现在无用了,因为它无处不在...

【讨论】:

【解决方案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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-27
          • 2018-07-29
          • 2020-10-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多