LABiometryType в iOS11 всегда возвращает None

введите описание изображения здесь

Независимо от того, какие настройки настроены в настройках пароля устройства и touchId, LAContext всегда возвращает их. Это просто бросает мне предупреждение, а не исключение.

Он работает только в бета-версии XCode 9.1 в бета-версии iOS11.1: (

Ответ 1

Я только что понял проблему! Вы должны называть 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:

"Это свойство задается только тогда, когда canEvaluatePolicy (_: ошибка:) преуспевает для биометрической политики. Значение по умолчанию равно none."

Ответ 2

Получил ту же проблему здесь, исправил ее с помощью следующего кода. Но он работает только с 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
            }
}

Ответ 3

Если вы используете код из @Ermish, isFaceIdSupported() вернет false, если на устройстве нет зарегистрированных лиц. Согласно моим последним результатам тестов на IOS SDK 11.1, просто вызовите функцию laContext.canEvaluatePolicy и не заботьтесь о результатах, затем проверьте содержимое laContext.biometryType.

Если нет зарегистрированных лиц, canEvaluatePolicy завершится с ошибкой, но устройство поддерживает Face ID.

Ответ 4

В Xamarin.iOS вам необходимо оценить политику до:

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