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

