Flutter-打开应用程序时提示输入TouchID / FaceID

时间:2018-10-30 17:26:06

标签: dart flutter touch-id face-id

我在实现TouchID / FaceID身份验证时遇到问题,该方法会在用户打开应用程序时自动提示用户。我正在为TouchID / FaceID使用local_auth依赖项。

在下面的代码中,生物识别身份验证将在应用恢复时弹出,但也无法将其关闭。如果按下主屏幕按钮,则它会消除TouchID提示,但立即开始重试,如果继续尝试,则会导致无限循环。它还会随机提示两次,因此,即使您成功使用第一个TouchID提示成功登录,它也会在之后立即再次弹出。有人知道解决此问题的方法吗?我在登录页面上还有一个TouchID按钮,用户可以按该按钮手动提示TouchID,但是我很想重新创建银行应用程序和其他应用程序的工作方式,当您自动打开该应用程序时,TouchID会在提示的地方进行操作。

void initState() {
  super.initState();

  SystemChannels.lifecycle.setMessageHandler((msg) async {
    if (msg==AppLifecycleState.resumed.toString()) {
      // If can pop, app is not at login screen
      // so don't prompt for authentication
      if (!Navigator.canPop(context)) {
        if (_useFingerprint) {
          SharedPreferences prefs = await SharedPreferences.getInstance();
          String password = prefs.getString('password');
          biometricAuthentication(_username, password);
        }
     }
  }
});

void biometricAuthentication(String user, String pass) async {
  print("Biometric Authentication Called");
  bool didAuthenticate = false;
  try {
    didAuthenticate = await localAuth.authenticateWithBiometrics(localizedReason: 'Please authenticate');
  } on PlatformException catch (e) {
    print(e);
  }

  if (!mounted) {
    return;
  } 

  if (!didAuthenticate) {
    return;
  }
  else {
    normalLogin(user, pass);   
  }
}

3 个答案:

答案 0 :(得分:0)

免责声明::我对iOS开发的经验不多,所以我有点想从Android推算。

我认为问题在于系统对话框使您的应用程序处于非活动状态,从而导致无限循环

  1. 该应用已恢复
  2. 该应用程序显示一个TouchID / FaceID对话框,从而使其自身不活动
  3. 用户确认对话框
  4. 您的应用再次出现在前台,从而恢复
  5. 请参阅步骤1

可能的解决方案

  • 不要在应用启动时要求进行身份验证,而是在应用中将要发生的重要动作时进行请求。这是打算使用身份验证功能的方式,因此它是最惯用的解决方案。 (我的最爱)
  • 设置时间限制,就像仅在用户离开x秒钟以上时显示对话框一样,从而从短时间(包括用于身份验证的时间)中滤除长时间的不活动状态。 (对我来说是一种解决方法)

答案 1 :(得分:0)

这对我有用

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  if (await _isBiometricAvailable()) {
    await _getListOfBiometricTypes();
    await _authenticateUser();
  }

  runApp(App());
}

答案 2 :(得分:0)

我想我设法解决了它。如果还有其他问题,请告诉我。

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  bool isAuthenticated = await Authentication.authenticateWithBiometrics();

  if (isAuthenticated) {
   runApp(MyApp());
 } else {
   main();
 }
}

这似乎在我每次打开应用程序时都有效。 此外,这是我的 authentification.dart 文件

class Authentication {
  static Future<bool> authenticateWithBiometrics() async {
   final LocalAuthentication localAuthentication = LocalAuthentication();
   bool isBiometricSupported = await localAuthentication.isDeviceSupported();
   bool canCheckBiometrics = await localAuthentication.canCheckBiometrics;

   bool isAuthenticated = false;

   if (isBiometricSupported && canCheckBiometrics) {
     isAuthenticated = await localAuthentication.authenticate(
       localizedReason: 'Please complete the biometrics to proceed.',
       //biometricOnly: true,
       stickyAuth: true,
     );
   }

   return isAuthenticated;
 }
}