web-dev-qa-db-ja.com

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)
    }

パスコードを入力した場合にこの画面を表示する方法は、アプリに移動します。これを達成する方法は私を助けます。よろしくお願いします。

5
saravanar

ポリシーを使用する場合 .deviceOwnerAuthentication すると、「パスワードの入力」オプションがすぐに表示されます。

使用する場合 .deviceOwnerAuthenticationWithBiometrics そのままの場合、「パスワードの入力」オプションは、最初に失敗した生体認証の試行後にのみ表示されます。

ユーザーの認証方法に関係なく、完了クロージャーが呼び出されます。

11
Paulw11

LAPolicyポリシー列挙値deviceOwnerAuthenticationWithBiometricsdeviceOwnerAuthenticationに置き換えます

注:ユーザーがbiometric(フェイス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)!)
    }
}
11
Krunal