Natywny UITextField Secure Text Entry forces English (US) keyboard

Mam bardzo prostą stronę logowania(login + hasło).

Moi użytkownicy są Francuzami, więc ich klawiatura jest francuska (azerty).

Od iOS 12, Po kliknięciu pola tekstowego hasła, które jest zabezpieczone, klawiatura przełącza się na angielski (qwerty), nawet jeśli nie mają tej klawiatury zainstalowanej na swoich urządzeniach. Co więcej, jeśli nie mają zainstalowanej tej klawiatury, nie mogą przełączyć się z powrotem na swoją klawiaturę.

Dowiedziałem się, że jeśli wyłączę Bezpieczny tekst Wpis, problem nie pojawia się.

Próbowałem też programowo ustawić isSecureTextEntry i pojawia się błąd.

Dodaję dwa screeny, po jednym dla każdego pola tekstowego.

Dziękuję bardzo za poświęcony czas i pomoc.

Tutaj wpisz opis obrazka

Tutaj wpisz opis obrazka

Author: Thib L, 2018-10-08

10 answers

Mam ten sam problem, w moim przypadku ten błąd pojawia się tylko z ekranem rejestru.

Powodem jest to, że Apple sprawdza nazwę klasy/func / parametru w celu określenia (za pomocą heurystyki), czy jest to ekran logowania/rejestracji i aktywuje automatycznie Automatyczne uzupełnianie hasła. Poprzez zastąpienie "register "przez" Patate " w moim kodzie, problem jest rozwiązany.

Odtwarzam ten problem z przykładową aplikacją z 2 polami tekstowymi (z wpisem tekstu zabezpieczającego) i kontrolerem widoku o nazwie "RegisterViewController". Z "PatateViewController", nie mam problemu.

Ponadto mam ten błąd w konsoli : [Autouzupełnianie] nie można pokazać automatyczne silne hasła dla aplikacji bundleID: * * * z powodu błędu: iCloud Keychain jest wyłączony

Źródło: https://developer.apple.com/documentation/security/password_autofill

Mam nadzieję, że znajdziesz lepszy sposób niż zmiana nazwy kodu.

 13
Author: Nico,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-08 20:12:22

Miałem ten sam problem pojawił się ostatnio w naszej aplikacji. Problem związany jest z nową funkcją PasswordAutofill firmy Apple.

Aby ominąć ten problem, możesz zastosować ten mały fragment kodu na bezpiecznym polu tekstowym

    if #available(iOS 12.0, *) {
        tfPassword.textContentType = .oneTimeCode
    }

To powinno rozwiązać ten błąd. Powinno to również naprawić ten błąd:

[Autouzupełnianie] nie można wyświetlić automatycznego silnego hasła dla bundleID aplikacji: * * * z powodu błędu: iCloud Keychain jest wyłączony

Ps: Ty może również dodać tę nową funkcję do aplikacji. Jest to link do artykułu wyjaśniającego proces wdrażania tej nowej funkcji Wyjaśnienie jak zaimplementować autouzupełnianie haseł

Mam nadzieję, że to pomoże.
 9
Author: Martin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-13 11:10:54

Miałem ten sam problem w Reaccie Native, gdy ustawiłem keyboardType na "numeric-pad". Jest to natywny problem z SYSTEMEM IOS z powodu domyślnego języka ustawionego w pliku info.plist.

Znalazłem rozwiązanie tutaj: https://github.com/facebook/react-native/issues/27972

Usuń te 2 linie, aby wyłączyć domyślny język:

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

Możesz też po prostu zmodyfikować <string>en</string> na <string>fr</string>, ale wtedy będziesz miał ten sam problem z angielskimi użytkownikami, którzy będą mieli przełącznik na klawiaturę azerty: /

 3
Author: maximegenestier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-04 09:28:38

Miał ten sam problem i rozwiązał go ustawiając Wszystkie moje pola tekstowe textContentType Na UITextContentType.oneTimeCode.

Oczywiście, oneTimeCode jest teraz bezużyteczny, ponieważ jest wszędzie...

 2
Author: Guillaume Berthier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-05 15:50:45

To samo rozwiązanie w Swiftui teraz:

TextField("placeholder",text: $YourTextBinding)
                        .textContentType(.oneTimeCode)
                        .keyboardType(.default)

Wystarczy dodać:

                        .textContentType(.oneTimeCode)
                        .keyboardType(.default)

Do a TextField lub a SecureField.

Mam nadzieję, że to pomoże !
 2
Author: theMouk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-24 10:10:50

Swift 3:

Utwórz klasę bazową dla UITextField z languageCode i textInputMode.

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;
}}

Użycie:

Set your value (ru, en,...) do languageCode. Wymusi to zmianę ustawień regionalnych na klawiaturze.

private func textConfigure(textField: UITextField) {

    textField.keyboardType = .default
    textField.autocapitalizationType = .words
    textField.languageCode = "ru"
}
Mam nadzieję, że ci pomogę.
 1
Author: kurlyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-08 11:50:59

IOS 12.1 naprawił problem dla mnie.

Musisz również ustawić parametr textContentType pola tekstowego hasła na .oneTimeCode

 1
Author: ndelanou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-08 13:33:30

Lamer a bug is, lamer the solution should be, I mean what a lame work by Apple.

Moim rozwiązaniem było wymusić skupienie się na polu hasła, a następnie skupić się na pierwszym polu, w moim przypadku było to usernameField.

- (void) viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self.passwordTextField becomeFirstResponder];
    [self.usernameTextField becomeFirstResponder];
}
 1
Author: TheFuquan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-23 14:10:54

To był naprawdę błąd iOS = > poprawiony w iOS 12.1

 0
Author: Thib L,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-26 09:10:50

Na wszelki wypadek poprawiłem to dodając to do mojego głównego kontrolera widoku:

func passwordSignUpViewController(forAuthUI authUI: FUIAuth, email: String, requireDisplayName: Bool) -> FUIPasswordSignUpViewController {
    return CustomPasswordSignUpViewController(authUI: authUI, email: email, requireDisplayName: true)
}

I stworzyłem podklasę 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
    }
 }
}
 0
Author: Sebastien G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-02-20 08:45:45