如果TouchID失效,转而使用系统密码进行身份验证。

13

我希望使用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)
    }

如何在输入密码后显示此屏幕,以便进入我的应用程序。 如何实现这一点,请帮助我。 提前致谢。

如何在输入密码后显示此屏幕,以便进入我的应用程序。 如何实现这一点,请帮助我。 提前致谢。

2个回答

22
如果您使用策略.deviceOwnerAuthentication,则“输入密码”选项会立即显示。
如果您使用.deviceOwnerAuthenticationWithBiometrics,就像现在这样,那么只有在第一次无法通过生物识别身份验证尝试后才会显示“输入密码”选项。
无论用户如何进行身份验证,都将调用您的完成闭包。

21

LAPolicy策略枚举值deviceOwnerAuthenticationWithBiometrics替换为deviceOwnerAuthentication

注意:如果用户启用了生物识别(面容ID或触控ID)身份验证,则设备首先会要求进行生物识别身份验证,如果用户选择回退身份验证,则只会显示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)!)
    }
}

如果输入的密码成功,那么如何重定向到我的应用程序。 - saravanar
@saravanar,您已经使用条件“if success {”成功地管理了它。如果密码正确,则密码视图将自动关闭并为您提供布尔值“success”,您可以将其用于进一步操作。 - Krunal
@Krunal 这个答案可以避免生物识别认证,甚至第一次也不需要,直接要求输入密码。 - Arshad Shaik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接