如何在Xamarin Forms安卓端添加Face ID身份验证功能
Xamarin Forms实现Face ID身份验证方案
核心实现逻辑
通过Xamarin Forms依赖服务(DependencyService)分别封装各平台原生生物识别API,iOS端调用系统LocalAuthentication框架实现Face ID调用与校验。
步骤1:共享项目中定义服务接口
public interface IBiometricAuthService { // 判断当前设备是否支持Face ID bool IsFaceIdSupported(); // 唤起身份验证,reason为弹出提示中展示的验证理由 Task<bool> AuthenticateAsync(string reason); }
步骤2:iOS平台实现服务
- 先在iOS项目的
Info.plist中添加Face ID权限说明,否则调用时应用会直接崩溃:
打开Info.plist的源码视图,添加如下配置:<key>NSFaceIDUsageDescription</key> <string>需要使用Face ID验证您的身份,保障账号安全</string> - 实现iOS端的验证服务:
[assembly: Dependency(typeof(BiometricAuthService_iOS))] namespace YourAppNamespace.iOS { public class BiometricAuthService_iOS : IBiometricAuthService { private LAContext _context; public bool IsFaceIdSupported() { _context = new LAContext(); NSError error; // 先判断设备是否支持生物识别 if (_context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, out error)) { // iOS 11+才支持Face ID判断 if (UIDevice.CurrentDevice.CheckSystemVersion(11, 0)) { return _context.BiometryType == LABiometryType.FaceId; } } return false; } public async Task<bool> AuthenticateAsync(string reason) { _context = new LAContext(); NSError error; // 先判断是否可以进行生物验证 if (!_context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, out error)) { return false; } var tcs = new TaskCompletionSource<bool>(); _context.EvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, reason, (success, evaluateError) => { tcs.SetResult(success); }); return await tcs.Task; } } }
步骤3:共享层调用示例
// 从依赖服务中获取实例 var authService = DependencyService.Get<IBiometricAuthService>(); if (authService.IsFaceIdSupported()) { bool isAuthenticated = await authService.AuthenticateAsync("请扫描面部完成验证"); if (isAuthenticated) { // 验证成功逻辑,比如跳转主页、解锁功能等 } else { // 验证失败逻辑,比如提示验证失败、引导使用密码登录等 } } else { // 设备不支持Face ID,走其他验证逻辑比如密码、指纹验证 }
注意事项
- 该实现仅兼容iOS 11及以上版本的Face ID设备,低于系统版本或无Face ID的设备会自动返回不支持,可自行适配Touch ID逻辑
- 若用户首次调用时拒绝了Face ID权限,后续调用
IsFaceIdSupported会直接返回false,可自行添加引导用户前往系统设置开启权限的逻辑 - 若需要同时兼容安卓端面部识别,可在安卓项目中调用原生
BiometricManagerAPI实现对应服务即可
内容的提问来源于stack exchange,提问作者Zubair Munir
相关产品推荐
相关产品推荐

