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

Xamarin.Forms调用BiometricPrompt.Authenticate()未等待用户认证问题求助

问题根因

BiometricPrompt.Authenticate() 本身是异步非阻塞API,调用后会立刻返回,指纹验证的结果需要等用户完成交互后才会通过回调方法返回,你当前的同步写法在调用Authenticate后立刻读取authSuccessful字段,此时回调还没触发,字段还保持初始的false值,所以会直接返回错误结果。
不需要也不建议手动阻塞线程等待结果,会导致UI卡死,所有官方示例都没有做阻塞处理就是因为这个API本身设计为异步回调模式,正确的做法是把回调包装为异步Task使用。

修复代码

首先修改BiometricAuthenticationCallback类,引入TaskCompletionSource传递异步结果:

class BiometricAuthenticationCallback : BiometricPrompt.AuthenticationCallback
{
    private readonly TaskCompletionSource<bool> _resultSource;

    public BiometricAuthenticationCallback(TaskCompletionSource<bool> resultSource)
    {
        _resultSource = resultSource;
    }

    public override void OnAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result)
    {
        _resultSource.TrySetResult(true);
    }

    public override void OnAuthenticationFailed()
    {
        _resultSource.TrySetResult(false);
    }

    public override void OnAuthenticationError(int errorCode, ICharSequence errString)
    {
        // 可根据errorCode自定义处理取消、验证次数超限等场景,这里统一返回失败
        _resultSource.TrySetResult(false);
    }
}

然后修改认证方法为异步实现,同时修复NegativeButton的参数错误:

public Task<bool> AuthenticateAsync()
{
    var resultSource = new TaskCompletionSource<bool>();
    // 构建生物识别弹窗
    biometricPrompt = new BiometricPrompt.Builder(Android.App.Application.Context)
        .SetTitle("身份验证")
        .SetNegativeButton("取消", Android.App.Application.Context.MainExecutor, (dialog, which) => 
        {
            resultSource.TrySetResult(false);
        })
        .Build();
    var cancellationSignal = new Android.OS.CancellationSignal();
    var authCallback = new BiometricAuthenticationCallback(resultSource);
    biometricPrompt.Authenticate(new CryptoObjectHelper().BuildCryptoObject(), cancellationSignal, Android.App.Application.Context.MainExecutor, authCallback);
    return resultSource.Task;
}
调用方式

在需要触发认证的地方使用await异步等待结果即可:

// 注意调用方方法需要标记为async
bool isAuthenticated = await AuthenticateAsync();
if (isAuthenticated)
{
    // 验证通过后的逻辑
}
else
{
    // 验证失败/取消后的逻辑
}
注意事项
  • 不要使用.Result或者Wait()同步阻塞等待认证结果,会导致UI线程卡死,应用无响应
  • 可根据业务需要扩展返回结果类型,不局限于bool值,可返回具体的错误码方便做差异化提示
  • 注意提前检查设备是否支持生物识别、是否已录入指纹,再调用认证方法

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:30:03