我在实现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);
}
}
答案 0 :(得分:0)
免责声明::我对iOS开发的经验不多,所以我有点想从Android推算。
我认为问题在于系统对话框使您的应用程序处于非活动状态,从而导致无限循环
可能的解决方案
答案 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;
}
}