Flutter - запрашивать TouchID / FaceID при открытии приложения - PullRequest
0 голосов
/ 30 октября 2018

У меня проблема с реализацией аутентификации TouchID / FaceID таким образом, что она автоматически запрашивает пользователя при открытии приложения. Я использую зависимость local_auth для TouchID / FaceID.

В приведенном ниже коде биометрическая аутентификация появится, когда приложение возобновит работу, но ее также невозможно отменить. Если вы нажмете кнопку «Домой», она отклонит запрос 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);   
  }
}

1 Ответ

0 голосов
/ 31 октября 2018

Отказ от ответственности: У меня мало опыта разработки под iOS, поэтому я немного экстраполирую из Android здесь.

Я считаю, что проблема в том, что системные диалоги делают ваше приложение неактивным, что ведет к бесконечному циклу

  1. приложение возобновляется
  2. приложение отображает диалоговое окно TouchID / FaceID, тем самым делая себя неактивным
  3. пользователь, подтверждающий диалог
  4. ваше приложение снова выходит на передний план, тем самым возобновляет
  5. см. Шаг 1

Возможные решения

  • Не запрашивайте аутентификацию при запуске приложения, а скорее, когда в приложении должны произойти важные действия. Именно так должна была использоваться функция аутентификации, поэтому это самое идиоматическое решение. (мой любимый)
  • Установить ограничение по времени, например, показывать диалоговое окно, только если пользователь отсутствовал более x секунд, тем самым отфильтровывая длинные неактивные фазы из коротких (в том числе для аутентификации). (для меня это обходной путь)
...