web-dev-qa-db-fra.com

UITextField Secure Text Entry natif oblige le clavier anglais (US)

J'ai une page de connexion très simple (login + mot de passe).

Mes utilisateurs sont français, leur clavier est donc français (azerty).

Depuis iOS 12, lorsqu'ils cliquent sur le champ de texte du mot de passe, qui est sécurisé, le clavier passe en anglais (qwerty), même si ce clavier n'est pas installé sur leurs appareils. De plus, s’ils n’ont pas installé ce clavier, ils ne peuvent pas revenir à leur clavier.

J'ai découvert que si je désactivais la saisie de texte sécurisée, le problème n'apparaissait pas.

J'ai également essayé de définir isSecureTextEntry par programme, et le bogue apparaît.

J'ajoute deux captures d'écran, une pour chaque champ de texte.

Merci beaucoup pour votre temps et votre aide.

 enter image description here

 enter image description here

11
Thib L

C’était vraiment un bug iOS => corrigé dans iOS 12.1

0
Thib L

J'ai le même problème, dans mon cas, ce bogue n'apparaît qu'avec un écran d'enregistrement.

La raison en est que Apple vérifie le nom de la classe/func/paramètre pour déterminer (avec l'heuristique) s'il s'agit d'un écran de connexion/enregistrement et l'activation automatique du mot de passe de remplissage automatique. , le problème est résolu.

Je reproduis ce problème avec un exemple d'application avec 2 champs de texte (avec une entrée de texte de sécurité) et un contrôleur de vue nommé "RegisterViewController". Avec un "PatateViewController", je n'ai pas le problème.

De plus, j'ai cette erreur dans la console:

Source: https://developer.Apple.com/documentation/security/password_autofill

J'espère que vous trouverez un meilleur moyen que de renommer votre code.

3
Nico

Avait le même problème et résolu en définissant all my textFields textContentType propriété à UITextContentType.oneTimeCode.

Bien entendu, oneTimeCode est maintenant inutile puisqu'il est partout ...

1
Guillaume Berthier

J'ai eu le même problème récemment apparu sur notre application . Le problème est lié à la nouvelle fonctionnalité de la PasswordAutofill de Apple.

Pour contourner ce problème, vous pouvez appliquer ce petit morceau de code sur votre champ de texte sécurisé.

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

Cela devrait résoudre ce bogue . Cela devrait également corriger cette erreur: 

[AutoFill] Impossible d'afficher les mots de passe forts automatiques pour l'application bundleID: *** en raison d'une erreur: le trousseau iCloud est désactivé.

Ps: Vous pouvez également ajouter cette nouvelle fonctionnalité à votre application . Ceci est un lien vers un article expliquant le processus pour implémenter cette nouvelle fonctionnalité Explication sur la manière d'implémenter le remplissage automatique du mot de passe

J'espère que ça aide.

0
Martin

iOS 12.1 corrigé le problème pour moi.

Vous devez également définir le paramètre textContentType du champ de saisie du mot de passe sur .oneTimeCode.

0
ndelanou

Swift 3:

Créez une classe de base pour UITextField avec languageCode et 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;
}}

Utilisation:

Définissez votre valeur (ru, en, ...) sur languageCode. Il va forcer changer les paramètres régionaux dans le clavier.

private func textConfigure(textField: UITextField) {

    textField.keyboardType = .default
    textField.autocapitalizationType = .words
    textField.languageCode = "ru"
}

J'espère vous aider.

0
kurlyk