我正在首次尝试在iOS上进行生物特征认证。
我的touch id身份验证代码运行正常。但是,如果触摸ID失败,我想使用设备PIN进行身份验证。但这仅在第二次触摸ID尝试失败后才起作用。第一次,当它失败时,将显示带有“尝试密码”按钮的警报。但是,当触摸它时,它会再次显示Enter touch id警报,而不是进入屏幕以输入设备图钉。
现在,如果触摸ID再次失败,并且如果我触摸输入密码按钮。进入屏幕以输入设备PIN。
但是为什么它第一次不起作用?来自Apple文档:
回退按钮最初是隐藏的。对于人脸ID,在第一个之后 身份验证尝试失败,系统将提示用户尝试 面部识别码再次出现或取消。备用按钮显示在 第二次尝试失败的Face ID。 对于Touch ID,后备按钮 在第一次尝试失败的Touch ID之后显示。
我看到它可以与Google Pay等应用一起使用。我在这里做错什么了。
这是我的代码。
public partial class AuthenticationViewController : UIViewController
{
private LAContext context;
public AuthenticationViewController(IntPtr handle) : base(handle)
{
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
if (UserDefaultsManager.RememberMe)
TryAuthenticate();
else
AppDelegate.Instance.GotoLoginController();
}
private void TryAuthenticate()
{
context = new LAContext();
NSError error = null;
if (UIDevice.CurrentDevice.CheckSystemVersion(11, 0) &&
context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, out error)) {
// Biometry is available on the device
context.EvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics,
"Unlock SmartFHR", HandleLAContextReplyHandler);
} else {
// Biometry is not available on the device
if (error != null) {
HandleLAContextReplyHandler(false, error);
} else {
TryDevicePinAuthentication(error);
}
}
}
private void TryDevicePinAuthentication(NSError error)
{
if (context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthentication, out error)) {
context.EvaluatePolicy(LAPolicy.DeviceOwnerAuthentication,
"Unlock SmartFHR", HandleLAContextReplyHandler);
}
}
private void HandleLAContextReplyHandler(bool success, NSError error)
{
DispatchQueue.MainQueue.DispatchAsync(() => {
if (success) {
ContinueAfterAuthSuccess();
return;
}
switch (error.Code) {
case (long)LAStatus.UserCancel:
AppDelegate.Instance.GotoLoginController(true);
break;
case (long)LAStatus.UserFallback:
case (long)LAStatus.BiometryNotEnrolled:
case (long)LAStatus.BiometryNotAvailable:
TryDevicePinAuthentication(error);
break;
}
});
}
private void ContinueAfterAuthSuccess()
{
if (Storyboard.InstantiateViewController("SplashController") is SplashController vc)
AppDelegate.Instance.Window.RootViewController = vc;
}
}
当第一次触摸id尝试失败并且我触摸“尝试密码”按钮时,我看到它调用了HandleLAContextReplyHandler,错误代码为LAStatus.UserFallback。
答案 0 :(得分:1)
LAPolicyDeviceOwnerAuthentication 的文档说:
如果Touch ID或Face ID可用,已注册且未禁用,则 首先要求用户。
因此,当您使用TryDevicePinAuthentication
显示身份验证窗口时,它仍将首先显示生物识别窗口。
如果您希望用户输入验证码,我认为DeviceOwnerAuthentication
就足够了。
private void TryAuthenticate()
{
context = new LAContext();
// if Biometry is available on the device, it will show it first
context.EvaluatePolicy(LAPolicy.DeviceOwnerAuthentication, "Unlock SmartFHR", HandleLAContextReplyHandler);
}
这样,您只需要处理用户取消此身份验证的情况。因为当用户单击后备按钮时,它将自动弹出一个密码输入窗口:
private void HandleLAContextReplyHandler(bool success, NSError error)
{
DispatchQueue.MainQueue.DispatchAsync(() => {
if (success)
{
ContinueAfterAuthSuccess();
return;
}
switch (error.Code)
{
case (long)LAStatus.UserCancel:
AppDelegate.Instance.GotoLoginController(true);
break;
default:
break;
}
});
}