73 votes

iOS 11 : désactivation de l'option d'affichage automatique du mot de passe ?

Dès à présent, j'aimerais ne pas utiliser la nouvelle option offerte par iOS 11, qui consiste à suggérer des mots de passe dans l'application. Lorsque je lance l'application sous iOS 11, j'obtiens l'option de remplissage automatique en haut du clavier et mon nom d'utilisateur et mon mot de passe ne s'affichent même pas.

Donc, ma question est la suivante : comment puis-je désactiver la nouvelle fonction de remplissage automatique du mot de passe afin que la touche du clavier ne soit pas affichée du tout et que le comportement général soit le même qu'avant iOS 11 ?

enter image description here

64voto

Bem Points 737

iOS 11 & 12 - Swift 4.2 (Mis à jour) :

        if #available(iOS 12, *) {
            // iOS 12: Not the best solution, but it works.
            passwordTextField.textContentType = .oneTimeCode
        } else {
            // iOS 11: Disables the autofill accessory view. 
            // For more information see the explanation below.
            emailTextField.textContentType = .init(rawValue: "")
            passwordTextField.textContentType = .init(rawValue: "")
        }

iOS 11 l'explication :

Assurez-vous de configurer tous vos UITextField des objets comme celui-ci.

Si vous avez par exemple un UITextField où l'utilisateur doit saisir son adresse électronique et un autre où l'utilisateur doit saisir son mot de passe. UITextContentType("") à leurs deux textContentType propriété. Sinon, cela ne fonctionnera pas et la vue accessoire autoFill sera toujours affichée.

9voto

Gal Shahar Points 333

iOS 12 semble reconnaître les textFields de mot de passe également par isSecureTextEntry et pas seulement par textContentType Il n'est donc pas vraiment possible de faire disparaître cette vue accessoire, à moins de définir textContentType sur rien et de supprimer la fonction secureEntry (et de provoquer une faille de sécurité dans votre application), ce qui empêcherait alors iOS 12 de reconnaître le textField comme un textField de mot de passe et d'afficher cette vue accessoire gênante.

Dans mon cas, l'accessoire a causé un bug qui rendait mon application non réactive lorsqu'elle était touchée (ce qui a également entraîné le rejet de mon application dans le processus d'examen des applications). J'ai donc dû supprimer cette fonctionnalité. Je ne voulais pas renoncer à cette fonction de sécurité et j'ai donc dû résoudre les choses par moi-même.

L'idée est de supprimer la fonction secureEntry mais de l'ajouter vous-même manuellement. Cela a fonctionné :

enter image description here


On peut le faire comme ça :

Swift 4 voies :

D'abord, comme répondu ici, mettre textContentType à rien :

if #available(iOS 10.0, *) {
    passwordText.textContentType = UITextContentType("")
    emailText.textContentType = UITextContentType("")
}

Ensuite, déclarez une variable String qui contiendra plus tard le contenu réel de notre textField :

var passwordValue = ""

Ajoutez une cible au passwordTextField, qui sera appelée chaque fois que le contenu du textField sera modifié :

passwordText.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)

Maintenant, c'est ce qui va faire la magie, déclarer la fonction qui va gérer les remplacements de texte :

@objc func textFieldDidChange(_ textField: UITextField) {
    if textField.text!.count > 1 {
        // User did copy & paste
        if passwordValue.count == 0 { // Pasted into an empty textField
            passwordValue = String(textField.text!)
        } else { // Pasted to a non empty textField
            passwordValue += textField.text!.substring(from: passwordValue.count)
        }
    } else {
        // User did input by keypad
        if textField.text!.count > passwordValue.count { // Added chars
            passwordValue += String(textField.text!.last!)
        } else if textField.text!.count < passwordValue.count { // Removed chars
            passwordValue = String(passwordValue.dropLast())
        }
    }
    self.passwordText.text = String(repeating: "•", count: self.passwordText.text!.count)
}

Enfin, définissez le champ de texte autocorrectionType a .no pour supprimer le texte prédictif :

passwordText.autocorrectionType = .no

C'est ça, utilisez passwordValue pour effectuer votre connexion.

J'espère que ça aidera quelqu'un.

UPDATE

Il attrape les valeurs collées aussi, j'ai oublié de l'ajouter avant.

8voto

gebirgsbaerbel Points 770

Cette fonction peut être désactivée en spécifiant un type de contenu qui n'est ni un nom d'utilisateur ni un mot de passe. Par exemple, si l'utilisateur doit entrer une adresse électronique, vous pouvez utiliser

usernameTextField?.textContentType = .emailAddress

8voto

Mikhail Zinov Points 141

Vous pouvez ajouter une extension pour UITextContentType comme ceci

extension UITextContentType {
    public static let unspecified = UITextContentType("unspecified")
}

après cela, vous pouvez l'utiliser

if #available(iOS 10.0, *) {
    passwordField.textContentType = .unspecified
}

6voto

Ammad Points 231

Une approche très simple dans ios11 a fonctionné pour moi. Supposons que vos iboutlets sont usernametextfield et passwordtextfield. Dans la fonction viewDidLoad() de votre viewcontroller qui contient les deux outlest utilisez le code suivant

usernametextfield.textContentType = UITextContentType("")
passwordtextfield.textContentType = UITextContentType("")

Après cela, vous ne verrez plus l'option accessoire de remplissage automatique lorsque vous tapez sur vos champs de texte.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X