iOS11 中的 LABiometryType 总是 return None

LABiometryType in iOS11 always return None

无论在设备密码和 touchId 设置中配置了什么设置,LAContext 总是 returns none。这只是向我发出警告而不是例外。

它仅适用于 XCode 9.1 Beta 中的 iOS11.1 beta,如建议的那样:(

这里遇到了同样的问题,用下面的代码修复了它。但它只适用于 Xcode 9.1 Beta(以及模拟器中的 iOS 11.1 beta)。

if (laContext.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: nil)) {

            if #available(iOS 11.0, *) {
                if (laContext.biometryType == LABiometryType.faceID) {
                    print("FaceId support")
                } else if (laContext.biometryType == LABiometryType.touchID) {
                    print("TouchId support")
                } else {
                    print("No Biometric support")
                }
            } else {
                // Fallback on earlier versions
            }
}

我刚刚找到问题了!您必须调用 canEvaluatePolicy 才能正确设置 biometryType

示例:

func isFaceIdSupported() -> Bool {
    if #available(iOS 11.0, *){
        if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil) {
            return context.biometryType == LABiometryType.typeFaceID
        }
    }

    return false
}

根据 Apple docs 的 biometryType:

"This property is only set when canEvaluatePolicy(_:error:) succeeds for a biometric policy. The default value is none."

如果您使用来自@Ermish 的代码,如果设备上没有已注册的面孔,isFaceIdSupported() 将 return 为 false。 根据我在 iOS SDK 11.1 上的最新测试显示,只需调用 laContext.canEvaluatePolicy 函数而不关心结果,然后检查 laContext.biometryType.

的内容

如果没有已注册的人脸,canEvaluatePolicy 将失败,但设备支持 Face ID。

在 Xamarin.iOS 中,您需要评估之前的政策:

   NSError error;
   bool success = context.CanEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, out error);
   if (context.BiometryType == LABiometryType.TouchId)
   {
       //Do Something
   }