iOS生物识别身份验证:仅在第二次生物识别失败尝试后才尝试使用密码

时间:2019-05-31 11:19:07

标签: ios xamarin.ios biometrics touch-id

我正在首次尝试在iOS上进行生物特征认证。

我的touch id身份验证代码运行正常。但是,如果触摸ID失败,我想使用设备PIN进行身份验证。但这仅在第二次触摸ID尝试失败后才起作用。第一次,当它失败时,将显示带有“尝试密码”按钮的警报。但是,当触摸它时,它会再次显示Enter touch id警报,而不是进入屏幕以输入设备图钉。

现在,如果触摸ID再次失败,并且如果我触摸输入密码按钮。进入屏幕以输入设备PIN。

但是为什么它第一次不起作用?来自Apple文档:

  

回退按钮最初是隐藏的。对于人脸ID,在第一个之后   身份验证尝试失败,系统将提示用户尝试   面部识别码再次出现或取消。备用按钮显示在   第二次尝试失败的Face ID。 对于Touch ID,后备按钮   在第一次尝试失败的Touch ID之后显示。

我看到它可以与Google Pay等应用一起使用。我在这里做错什么了。

这是我的代码。

public partial class AuthenticationViewController : UIViewController
{

    private LAContext context;

    public AuthenticationViewController(IntPtr handle) : base(handle)
    {
    }

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        if (UserDefaultsManager.RememberMe)
            TryAuthenticate();
        else
            AppDelegate.Instance.GotoLoginController();
    }

    private void TryAuthenticate()
    {
        context = new LAContext();
        NSError error = null;

        if (UIDevice.CurrentDevice.CheckSystemVersion(11, 0) &&
            context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, out error)) {
            // Biometry is available on the device
            context.EvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics,
                "Unlock SmartFHR", HandleLAContextReplyHandler);
        } else {
            // Biometry is not available on the device
            if (error != null) {
                HandleLAContextReplyHandler(false, error);
            } else {
                TryDevicePinAuthentication(error);
            }
        }
    }

    private void TryDevicePinAuthentication(NSError error)
    {
        if (context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthentication, out error)) {
            context.EvaluatePolicy(LAPolicy.DeviceOwnerAuthentication,
                "Unlock SmartFHR", HandleLAContextReplyHandler);
        }
    }

    private void HandleLAContextReplyHandler(bool success, NSError error)
    {
        DispatchQueue.MainQueue.DispatchAsync(() => {
            if (success) {
                ContinueAfterAuthSuccess();
                return;
            }
            switch (error.Code) {
                case (long)LAStatus.UserCancel:
                    AppDelegate.Instance.GotoLoginController(true);
                    break;
                case (long)LAStatus.UserFallback:
                case (long)LAStatus.BiometryNotEnrolled:
                case (long)LAStatus.BiometryNotAvailable:
                    TryDevicePinAuthentication(error);
                    break;
            }
        });
    }

    private void ContinueAfterAuthSuccess()
    {
        if (Storyboard.InstantiateViewController("SplashController") is SplashController vc)
            AppDelegate.Instance.Window.RootViewController = vc;
    }

}

当第一次触摸id尝试失败并且我触摸“尝试密码”按钮时,我看到它调用了HandleLAContextReplyHandler,错误代码为LAStatus.UserFallback。

1 个答案:

答案 0 :(得分:1)

LAPolicyDeviceOwnerAuthentication 的文档说:

  

如果Touch ID或Face ID可用,已注册且未禁用,则   首先要求用户。

因此,当您使用TryDevicePinAuthentication显示身份验证窗口时,它仍将首先显示生物识别窗口。

如果您希望用户输入验证码,我认为DeviceOwnerAuthentication就足够了。

private void TryAuthenticate()
{
    context = new LAContext();

    // if Biometry is available on the device, it will show it first
    context.EvaluatePolicy(LAPolicy.DeviceOwnerAuthentication, "Unlock SmartFHR", HandleLAContextReplyHandler);
}

这样,您只需要处理用户取消此身份验证的情况。因为当用户单击后备按钮时,它将自动弹出一个密码输入窗口:

private void HandleLAContextReplyHandler(bool success, NSError error)
{
    DispatchQueue.MainQueue.DispatchAsync(() => {
        if (success)
        {
            ContinueAfterAuthSuccess();
            return;
        }
        switch (error.Code)
        {
            case (long)LAStatus.UserCancel:
                AppDelegate.Instance.GotoLoginController(true);
                break;
            default:
                break;
        }
    });
}