Собственная UITextField Secure Text Entry заставляет английскую (US) клавиатуру

У меня очень простая страница входа (логин + пароль).

Мои пользователи французские, поэтому их клавиатура французская (azerty).

Начиная с iOS 12, когда они нажимают на текстовое поле пароля, которое защищено, клавиатура переключается на английский (qwerty), даже если у них нет этой клавиатуры, установленной на их устройствах. Более того, если у них не установлена эта клавиатура, они не могут вернуться на свою клавиатуру.

Я узнал, что если я деактивирую Secure Text Entry, проблема не появится.

Я также попытался установить isSecureTextEntry программно, и появляется ошибка.

Я добавляю два скриншота, по одному для каждого текстового поля.

Большое вам спасибо за ваше время и помощь.

enter image description here

enter image description here

Ответ 1

Это была действительно ошибка iOS => исправлена в iOS 12.1

Ответ 2

У меня та же проблема, в моем случае эта ошибка появляется только с экрана регистрации.

Причина в том, что Apple проверяет имя класса /func/параметра, чтобы определить (с помощью эвристики), является ли это экраном входа/регистрации и автоматически активировать пароль автозаполнения. Заменив "регистрация" на "Патат" в моем коде, проблема решена.

Я воспроизвожу эту проблему с примером приложения с 2 текстовыми полями (с вводом текста безопасности) и контроллером представления с именем "RegisterViewController". С "PatateViewController" у меня нет проблемы.

Кроме того, у меня в консоли возникает эта ошибка: [Автозаполнение] Не удается отобразить автоматические надежные пароли для идентификатора пакета приложения: *** из-за ошибки: брелок iCloud отключен

Источник: https://developer.apple.com/documentation/security/password_autofill

Надеюсь, вы найдете лучший способ, чем переименовать код.

Ответ 3

У меня была такая же проблема, недавно появившаяся в нашем приложении. Проблема связана с новой функцией PasswordAutofill от Apple.

Чтобы обойти эту проблему, вы можете применить этот маленький кусочек кода в безопасном текстовом поле

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

Это должно устранить эту ошибку. Это также должно исправить эту ошибку:

[Автозаполнение] Невозможно отобразить автоматические надежные пароли для идентификатора пакета приложения: *** из-за ошибки: брелок iCloud отключен

PS: Вы также можете добавить эту новую функцию в ваше приложение. Это ссылка на статью, объясняющую процесс реализации этой новой функции. Объяснение того, как реализовать автозаполнение пароля.

Надеюсь, поможет.

Ответ 4

Если бы та же проблема, и решить ее, установив все мои TextFields textContentType свойство UITextContentType.oneTimeCode.

Конечно, oneTimeCode теперь бесполезен, поскольку он везде...

Ответ 5

Swift 3:

Создайте базовый класс для UITextField с помощью languageCode и 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;
}}

Использование:

Задайте значение (ru, en,...) для языкаCode. Это заставит изменить локаль на клавиатуре.

private func textConfigure(textField: UITextField) {

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

Надеюсь вам помочь.

Ответ 6

iOS 12.1 исправила проблему для меня.

Вы также должны установить параметр textContentType текстового .oneTimeCode пароля в .oneTimeCode

Ответ 7

Ламер ошибка, ламер решение должно быть, я имею в виду то, что неудачная работа Apple.

Мое решение состояло в том, чтобы сосредоточиться на поле пароля, а затем на первом поле, в моем случае это было имя пользователя.

- (void) viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self.passwordTextField becomeFirstResponder];
    [self.usernameTextField becomeFirstResponder];
}