Если TouchID не работает, перейдите к аутентификации системного пароля.

Я хочу использовать TouchID для аутентификации моего приложения, аутентификация прошла успешно. Если TouchID не совпадает, открывается предупреждение «Попробуйте еще раз», а в этом предупреждении есть опция «Введите пароль». Если пользователь выбирает это, должна отображаться аутентификация системного пароля, но как я могу это сделать?

Здесь поделитесь моим кодом:

func touchIDAuthentication() {
    let context = LAContext() //1
    var error:NSError?
    guard context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else {
        showAlertViewIfNoBiometricSensorHasBeenDetected()
        return
    }
    if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &errorPointer) {
        context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason, reply: { (success, error) in
            if success {
                DispatchQueue.main.async {
                    print("Authentication was successful")
                }
            }else {
                DispatchQueue.main.async {
                    self.displayErrorMessage(error: error as! LAError )
                    print("Authentication was error")
                }
            }
        })
    }else {
        self.showAlertWith(title: "Error", message: (errorPointer?.localizedDescription)!)
    }
}



func displayErrorMessage(error:LAError) {
        var message = ""
        switch error.code {
        case LAError.authenticationFailed:
            message = "Authentication Failed."
            break
        case LAError.userCancel:
            message = "User Cancelled."
            break
        case LAError.userFallback:
            message = "Fallback authentication mechanism selected."
            break
        case LAError.touchIDNotEnrolled:
            message = "Touch ID is not enrolled."

        case LAError.passcodeNotSet:
            message = "Passcode is not set on the device."
            break
        case LAError.systemCancel:
            message = "System Cancelled."
            break
        default:
            message = error.localizedDescription
        }
        self.showAlertWith(title: "Authentication Failed", message: message)
    }

Как отобразить этот экран, если ввести пароль, который он переместит в мое приложение. Как добиться этого, помогите мне. Спасибо заранее.


person saravanar    schedule 09.11.2017    source источник


Ответы (2)


Если вы используете политику .deviceOwnerAuthentication, то опция "Введите пароль" отображается сразу .

Если вы используете .deviceOwnerAuthenticationWithBiometrics, то кнопка "Введите пароль" отображается только после первой неудачной попытки биометрической аутентификации.

Независимо от того, как пользователь аутентифицируется, будет вызвано ваше закрытие завершения.

person Paulw11    schedule 09.11.2017

Замените значение перечисления политик LAPolicy deviceOwnerAuthenticationWithBiometrics на deviceOwnerAuthentication

Примечание. Если у пользователя включена аутентификация biometric (идентификатор лица или сенсорный идентификатор), то устройство сначала запросит биометрическую аутентификацию, а если пользователь выберет откатную аутентификацию, то только deviceOwnerAuthentication будет показывать экран с паролем.

Попробуйте это и посмотрите:

func touchIDAuthentication() {
    let context = LAContext()
    var error:NSError?

    // edit line - deviceOwnerAuthentication
    guard context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &error) else {
        //showAlertViewIfNoBiometricSensorHasBeenDetected()
        return
    }

    // edit line - deviceOwnerAuthentication
    if context.canEvaluatePolicy(.deviceOwnerAuthentication, error: &errorPointer) {

        // edit line - deviceOwnerAuthentication
        context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: reason, reply: { (success, error) in
            if success {
                DispatchQueue.main.async {
                    print("Authentication was successful")
                }
            }else {
                DispatchQueue.main.async {
                    //self.displayErrorMessage(error: error as! LAError )
                    print("Authentication was error")
                }
            }
        })
    }else {
       // self.showAlertWith(title: "Error", message: (errorPointer?.localizedDescription)!)
    }
}
person Krunal    schedule 09.11.2017
comment
если пароль введен успешно, то как перенаправить в мое приложение. - person saravanar; 09.11.2017
comment
@saravanar, вы уже справились с этим, используя условие if success {. Если код-пароль правильный, то просмотр кода-пароля будет закрыт автоматически и даст вам sucess в качестве логического значения, которое вы можете использовать для дальнейших действий. - person Krunal; 09.11.2017
comment
@Krunal с этим ответом не будет запрашивать биометрическую аутентификацию даже в первый раз, он напрямую попросит ввести пароль - person Arshad Shaik; 09.07.2021