You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NET8 MAUI应用恢复时Plugin.Fingerprint生物验证无法终止问题

问题分析

你在OnResume中使用async void调用指纹验证,且未配置取消机制,再加上应用恢复时UI上下文可能未完全就绪,导致验证弹窗无法响应取消操作,只能强制关闭应用。

解决方案

1. 添加取消令牌控制验证生命周期

在App类中维护一个CancellationTokenSource实例,用于在应用再次进入后台时取消指纹验证请求:

private CancellationTokenSource _fingerprintCts;

protected override async void OnResume()
{
    base.OnResume(); // 务必调用基类方法

    _fingerprintCts?.Cancel(); // 取消之前未完成的请求
    _fingerprintCts = new CancellationTokenSource();

    var isAvailable = await CrossFingerprint.Current.IsAvailableAsync(true);
    if (isAvailable)
    {
        var request = new AuthenticationRequestConfiguration(
                                 "Login using biometrics", 
                                 "Confirm login with your biometrics")
        {
            AllowAlternativeAuthentication = true
        };

        try
        {
            var result = await CrossFingerprint.Current.AuthenticateAsync(request, _fingerprintCts.Token);
            Console.WriteLine(result.Status);
        }
        catch (OperationCanceledException)
        {
            // 处理取消逻辑
            Console.WriteLine("指纹验证已取消");
        }
    }
}

protected override void OnSleep()
{
    base.OnSleep();
    _fingerprintCts?.Cancel(); // 应用进入后台时取消验证
    _fingerprintCts?.Dispose();
    _fingerprintCts = null;
}

2. 绑定窗口Activated事件替代OnResume(可选更可靠方案)

MAUI的OnResume可能在窗口完全激活前触发,导致指纹验证弹窗的UI上下文异常。可以改为监听窗口的Activated事件,确保UI就绪后再启动验证:

private CancellationTokenSource _fingerprintCts;

protected override void OnStart()
{
    base.OnStart();
    if (Application.Current.Windows.FirstOrDefault() is Window mainWindow)
    {
        mainWindow.Activated += MainWindow_Activated;
    }
}

private async void MainWindow_Activated(object sender, EventArgs e)
{
    _fingerprintCts?.Cancel();
    _fingerprintCts = new CancellationTokenSource();

    var isAvailable = await CrossFingerprint.Current.IsAvailableAsync(true);
    if (isAvailable)
    {
        var request = new AuthenticationRequestConfiguration(
                                 "Login using biometrics", 
                                 "Confirm login with your biometrics")
        {
            AllowAlternativeAuthentication = true
        };

        try
        {
            var result = await CrossFingerprint.Current.AuthenticateAsync(request, _fingerprintCts.Token);
            Console.WriteLine(result.Status);
        }
        catch (OperationCanceledException)
        {
            Console.WriteLine("指纹验证已取消");
        }
    }
}

protected override void OnSleep()
{
    base.OnSleep();
    _fingerprintCts?.Cancel();
    _fingerprintCts?.Dispose();
    _fingerprintCts = null;
}

关键注意点

  • 必须在应用进入后台(OnSleep)时取消并释放CancellationTokenSource,避免内存泄漏和残留请求。
  • 不要忽略OperationCanceledException,这是取消验证时的正常抛出,需要捕获处理。
  • 调用base.OnResume()和base.OnSleep()确保MAUI生命周期的正常执行。

内容的提问来源于stack exchange,提问作者Enrico

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 21:22:11