biometricAuthUtils.dart 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import 'package:flutter/services.dart';
  2. import 'package:appfx/utils/logger.dart';
  3. import 'package:local_auth/local_auth.dart';
  4. import 'package:flutter_secure_storage/flutter_secure_storage.dart';
  5. export 'package:local_auth/local_auth.dart' show BiometricType;
  6. class BiometricAuthUtils {
  7. bool canCheckBiometrics = false;
  8. List<BiometricType> availableBiometrics = [];
  9. final LocalAuthentication auth = LocalAuthentication();
  10. final FlutterSecureStorage storage = const FlutterSecureStorage();
  11. Future<void> init() async {
  12. try {
  13. canCheckBiometrics = await checkBiometrics();
  14. if (canCheckBiometrics) {
  15. availableBiometrics = await getAvailableBiometrics();
  16. }
  17. } catch (error) {
  18. Log.e('init error: $error');
  19. }
  20. }
  21. bool get isSupportFaceId {
  22. return availableBiometrics.any((type) => type == BiometricType.face);
  23. }
  24. bool get isSupportTouchId {
  25. return availableBiometrics.any((type) => type == BiometricType.fingerprint);
  26. }
  27. // 检查设备是否支持生物识别
  28. Future<bool> checkBiometrics() async {
  29. try {
  30. canCheckBiometrics = await auth.canCheckBiometrics;
  31. return canCheckBiometrics;
  32. } on PlatformException catch (e) {
  33. Log.e('检查设备是否支持生物识别失败: $e');
  34. canCheckBiometrics = false;
  35. return false;
  36. }
  37. }
  38. // 获取可用的生物识别类型
  39. Future<List<BiometricType>> getAvailableBiometrics() async {
  40. try {
  41. availableBiometrics = await auth.getAvailableBiometrics();
  42. return availableBiometrics;
  43. } on PlatformException catch (e) {
  44. Log.e('获取生物识别类型失败: $e');
  45. availableBiometrics = [];
  46. return availableBiometrics;
  47. }
  48. }
  49. // 进行生物识别认证
  50. Future<bool> authenticateWithBiometrics(String reason) async {
  51. try {
  52. final bool didAuthenticate = await auth.authenticate(
  53. localizedReason: reason, // '请进行人脸识别以访问您的密码',
  54. biometricOnly: true,
  55. sensitiveTransaction: true,
  56. persistAcrossBackgrounding: false,
  57. );
  58. return didAuthenticate;
  59. } on PlatformException catch (e) {
  60. Log.e('认证失败: $e');
  61. return false;
  62. }
  63. }
  64. }