我在实现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);
}
}
这对我有效
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
if (await _isBiometricAvailable()) {
await _getListOfBiometricTypes();
await _authenticateUser();
}
runApp(App());
}
我想我已经解决了。如果还有其他问题,请告诉我。
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
bool isAuthenticated = await Authentication.authenticateWithBiometrics();
if (isAuthenticated) {
runApp(MyApp());
} else {
main();
}
}
这似乎在我每次打开应用程序时都有效。此外,这是我的身份证明。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;
}
}
试试这个:
创建一个类来处理应用程序的生命
class LifecycleEventHandler extends WidgetsBindingObserver {
final Function onResume;
LifecycleEventHandler(this.onResume);
@override
Future<void> didChangeAppLifecycleState(AppLifecycleState state) async {
switch (state) {
case AppLifecycleState.resumed:
onResume.call();
break;
default:
break;
}
}
}
然后在你的主要:
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(
LifecycleEventHandler(() async {
//Put your auth function here (biometric auth or passcode)
}),
);
}
每次您返回应用程序时,您所做的操作都将执行
免责声明:我对iOS开发没有太多经验,所以我在这里有点从Android推断。
我认为问题在于系统对话框会使你的应用程序处于非活动状态,从而导致的无限循环
- 应用程序恢复
- 该应用程序显示TouchID/FaceID对话框,从而使自己处于非活动状态
- 用户确认对话框
- 您的应用程序再次出现在前台,从而恢复
- 参见步骤1
可能的解决方案
- 不要在应用程序启动时要求验证,而是在应用程序中将要执行重要操作时要求验证。这就是身份验证功能的使用方式,因此它是最常用的解决方案(我的最爱(
- 设置一个时间限制,比如只在用户离开时间超过x秒时显示对话框,从而从短阶段(包括用于身份验证的阶段(中筛选出长的非活动阶段(我觉得这是一个变通办法(