Не удается проверить идентификатор лица, когда пользователю отказано в использовании

Я хочу выполнять различные действия для пользователей, если устройство поддерживает Face ID или Touch ID.

При использовании Face ID iOS запрашивает разрешение на использование. (в отличие от Touch ID).

И если пользователь отказывает в разрешении, context.biometryType возвращает LABiometryTypeNone.

Есть ли возможность проверить Touch ID или Face ID, поддерживаемые устройством.

LAContext *context = [[LAContext alloc] init];

NSError *error;

if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {

}

if (@available(iOS 11.0, *)) {
    if (context.biometryType == LABiometryTypeFaceID) {
        // support FaceID 
    }
}

// support TouchID

Консольный вывод

(lldb) po error
Error Domain=com.apple.LocalAuthentication Code=-6 "User has denied the use of biometry for this app." UserInfo={NSLocalizedDescription=User has denied the use of biometry for this app.}

(lldb) po context.biometryType
LABiometryTypeNone

ПРИМЕЧАНИЕ. Я не хочу использовать аутентификацию с помощью пароля. Мне просто нужно знать, устройство поддерживает Touch ID или Face ID

2 ответа

Слишком поздно, но я надеюсь, что это поможет тем, у кого такая же проблема.

LAContext(). CanEvaluatePolicy(.DeviceOwnerAuthentication, error: nil) LAContext (). CanEvaluatePolicy(.DeviceOwnerAuthenticationWithBiometrics, error: nil)

разница между deviceOwnerAuthentication и deviceOwnerAuthenticationWithBiometrics в том, что первый сообщит вам, что у устройства есть метод аутентификации или нет.. второй имеет такое же поведение, но работает только в том случае, если пользователь принял разрешение.

enum BiometryResult: Int {
case faceID
case touchID
case notExist
}
class func biometryType() -> BiometryResult {
    let context = LAContext()
    if (context.canEvaluatePolicy(.deviceOwnerAuthentication, error: nil)) {
        if (context.biometryType == LABiometryType.faceID) {
            return .faceID
        } else if (context.biometryType == LABiometryType.touchID) {
            return .touchID
        } else {
            return .notExist
        }
    }
    return .notExist
}

Нет. Если пользователь отклоняет запрос на Конфиденциальность с NSFaceIDUsageDescription, все будущие случаи LAContext будет иметь biometryType собственностью .none один раз canEvalutePolicy:error: называется на них.

Использовать собственность biometryType из LAContext проверить и оценить доступную биометрическую политику. (Для аутентификации с помощью пароля, когда биометрический сбой, используйте: LAPolicyDeviceOwnerAuthentication)

Попробуйте это и увидите:

LAContext *laContext = [[LAContext alloc] init];

NSError *error;


// For a passcode authentication , when biometric fails, use: LAPolicyDeviceOwnerAuthentication
//if ([laContext canEvaluatePolicy: LAPolicyDeviceOwnerAuthentication error:&error]) {
if ([laContext canEvaluatePolicy: LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {    
    if (error != NULL) {
        // handle error
    } else {

        if (@available(iOS 11, *)) {
            if (laContext.biometryType == LABiometryTypeFaceID) {
                //localizedReason = "Unlock using Face ID"
                NSLog(@"FaceId support");
            } else if (laContext.biometryType == LABiometryTypeTouchID) {
                //localizedReason = "Unlock using Touch ID"
                NSLog(@"TouchId support");
            } else {
                //localizedReason = "Unlock using Application Passcode"
                NSLog(@"No biometric support or Denied biometric support");
            }
        } else {
            // Fallback on earlier versions
        }


        [laContext evaluatePolicy: LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"Test Reason" reply:^(BOOL success, NSError * _Nullable error) {

            if (error != NULL) {
                // handle error
            } else if (success) {
                // handle success response
            } else {
                // handle false response
            }
        }];
    }
}
Другие вопросы по тегам