生物辨识使用local_auth
<key>NSFaceIDUsageDescription</key>
<string>Why is my app authenticating using face id?</string>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.app">
<uses-permission android:name="android.permission.USE_FINGERPRINT"/>
<manifest>
都是透过LocalAuthentication()
这个实例
canEvaluatePolicy☘️☘️☘️
Future<void> _checkBiometrics() async {
bool canCheckBiometrics;
canCheckBiometrics = await _localAuth.canCheckBiometrics;
if (!mounted) return;
setState(() {
_canEvaluatePolicy = canCheckBiometrics ? "是" : "否";
});
}
LABiometryType☘️☘️☘️
注意一下 这边是回传一个阵列 不是某个类型⚠️⚠️⚠️
所以代表Andorid好像有装置可以同时支援(难保以後iPhone不会)
Future<void> _getAvailableBiometrics() async {
List<BiometricType> availableBiometrics;
availableBiometrics = await _localAuth.getAvailableBiometrics();
if (!mounted) return;
setState(() {
if (availableBiometrics.isEmpty) {
_biometryType = noEnrolledWording;
} else {
switch (availableBiometrics.first) {
case BiometricType.face:
_biometryType = "点我验证Face ID";
break;
case BiometricType.fingerprint:
_biometryType = "点我验证Touch ID";
break;
default:
_biometryType = noEnrolledWording;
break;
}
}
});
}
evaluatePolicy☘️☘️☘️
Future<void> _authenticate() async {
print("验证中");
bool authenticated = false;
try {
authenticated = await _localAuth.authenticateWithBiometrics(
localizedReason: 'Scan your fingerprint to authenticate',
stickyAuth: true,
useErrorDialogs: true,
iOSAuthStrings: IOSAuthMessages(
lockOut: "锁",
goToSettingsButton: "设定",
goToSettingsDescription: "请设定",
cancelButton: "算了"
)
);
} on PlatformException catch (e) {
print("例外");
print(e);
}
if (!mounted) return;
final result = authenticated ? "验证成功" : "验证失败";
scaffoldKey.currentState.showSnackBar(SnackBar(content: Text(result)));
}
上面第2节中的三个function中可以看到
官方用了个小技巧mounted
来判断await是否回来了
如果是Android的话
可以透过_localAuth.stopAuthentication()
来中断验证
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:local_auth/auth_strings.dart';
import 'package:local_auth/local_auth.dart';
class LessonPageLocalAuthentication extends StatefulWidget {
@override
_LessonPageLocalAuthenticationState createState() => _LessonPageLocalAuthenticationState();
}
class _LessonPageLocalAuthenticationState extends State<LessonPageLocalAuthentication> {
final noEnrolledWording = "未启用生物辨识";
final scaffoldKey = GlobalKey<ScaffoldState>();
final LocalAuthentication _localAuth = LocalAuthentication();
String _canEvaluatePolicy = "";
String _biometryType = "";
Future<void> _checkBiometrics() async {
bool canCheckBiometrics;
canCheckBiometrics = await _localAuth.canCheckBiometrics;
if (!mounted) return;
setState(() {
_canEvaluatePolicy = canCheckBiometrics ? "是" : "否";
});
}
Future<void> _getAvailableBiometrics() async {
List<BiometricType> availableBiometrics;
availableBiometrics = await _localAuth.getAvailableBiometrics();
if (!mounted) return;
setState(() {
if (availableBiometrics.isEmpty) {
_biometryType = noEnrolledWording;
} else {
switch (availableBiometrics.first) {
case BiometricType.face:
_biometryType = "点我验证Face ID";
break;
case BiometricType.fingerprint:
_biometryType = "点我验证Touch ID";
break;
default:
_biometryType = noEnrolledWording;
break;
}
}
});
}
Future<void> _authenticate() async {
print("验证中");
bool authenticated = false;
try {
authenticated = await _localAuth.authenticateWithBiometrics(
localizedReason: 'Scan your fingerprint to authenticate',
stickyAuth: true,
useErrorDialogs: true,
iOSAuthStrings: IOSAuthMessages(
lockOut: "锁",
goToSettingsButton: "设定",
goToSettingsDescription: "请设定",
cancelButton: "算了"
)
);
} on PlatformException catch (e) {
print("例外");
print(e);
}
if (!mounted) return;
final result = authenticated ? "验证成功" : "验证失败";
scaffoldKey.currentState.showSnackBar(SnackBar(content: Text(result)));
}
@override
void initState() {
super.initState();
_checkBiometrics();
_getAvailableBiometrics();
}
@override
Widget build(BuildContext context) {
return Scaffold(
key: scaffoldKey,
appBar: AppBar(
title: Text("Local Authentication"),
),
body: Container(
alignment: Alignment.center,
child: Column(
children: [
SizedBox(height: 100),
Text("您的装置是否支援生物辨识:$_canEvaluatePolicy"),
OutlineButton(
child: Text(_biometryType),
onPressed: _biometryType == noEnrolledWording ? null : _authenticate
// onPressed: _authenticate
)
],
)
)
);
}
}
本集内容Android版请见:iOS Developer Learning Android. Lesson 21
下集预告:Map
最後提供一下github.com/mark33699/IDLF
前言 总算开始了一个跟DL比较有关系的名词啦(?)一直以来科学家总想模仿动物的大脑来做AI结构,所以...
CSS box model 盒子模型也称为区块模型,主要是将传统的HTML区块概念再进一步的规范。我...
TWICE出新MV啦! 转载於:JYP Entertainment 官方YouTube 非本科生直接...
2021 铁人赛 DAY5 昨天已经简单介绍过Prometheus了,今天要来将他装在我们的丛集里,...
大家如果对於昨天的 E2E 测试如果没有什麽问题的话,今天就来为我们的被保人表单撰写 E2E 测试...