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
相关产品推荐
相关产品推荐

