Как определить, поддерживает ли устройство FaceID или нет?

Еще рано спрашивать, но я планирую добавить функцию специально для FaceID, поэтому перед этим мне нужно проверить, поддерживает ли устройство FaceID или нет? Нужно предложение и помощь. Заранее спасибо.


person Aleem    schedule 25.09.2017    source источник
comment
Вы удосужились прочитать документацию Apple? developer.apple.com/documentation/localauthentication/   -  person Ashley Mills    schedule 25.09.2017
comment
Я гуглил и искал в Stackoverflow, но не нашел правильного ответа, поэтому после этого прочитал документацию Apple и опубликовал ответ, я надеюсь, что это поможет другим, кто приходит сюда (stackoverflow), найти быстрое решение, когда у них мало времени :). stackoverflow.com/a/46402895/671060   -  person Aleem    schedule 02.11.2017


Ответы (4)


Я обнаружил, что вам нужно вызвать canEvaluatePolicy, прежде чем вы правильно получите тип биометрии. Если вы этого не сделаете, вы всегда получите 0 для необработанного значения.

Что-то вроде этого в Swift 3, протестировано и работает в Xcode 9.0 и бета-версии 9.0.1.

class func canAuthenticateByFaceID () -> Bool {
    //if iOS 11 doesn't exist then FaceID doesn't either
    if #available(iOS 11.0, *) {
        let context = LAContext.init()

        var error: NSError?

        if context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: &error) {
            //As of 11.2 typeFaceID is now just faceID
            if (context.biometryType == LABiometryType.typeFaceID) {
                return true
            }
        }
    }

    return false
}

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

person Stuart P.    schedule 31.10.2017
comment
Мы обнаружили, что этот код работает, если в телефоне есть идентификатор лица, и он зарегистрирован и в порядке. Однако, если идентификатор лица не зарегистрирован или если он блокируется из-за распознавания слишком большого количества неправильных лиц, эта функция возвращает false (что приводит к тому, что наш код, по крайней мере, идет по пути неверного Touch ID). Кто-нибудь знает способ определить, поддерживает ли устройство Face ID независимо от того, зарегистрировано оно или заблокировано? - person Orion Edwards; 09.02.2018
comment
Это всегда возвращает false на симуляторе iPhone X - person Bogdan Razvan; 13.06.2018
comment
На самом деле не всегда: только когда он не зачислен. В строке меню симулятора для iPhone X выберите «Оборудование» > «Идентификатор лица» > «Зарегистрировано». - person Manu Mateos; 21.06.2018

Версия Objective-C

- (BOOL) isFaceIdSupported{
    if (@available(iOS 11.0, *)) {
        LAContext *context = [[LAContext alloc] init];
        if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:nil]){
            return ( context.biometryType == LABiometryTypeFaceID);
        }
    }
    return NO;
}
person Hai Hw    schedule 05.12.2017

Спасибо, Эшли Миллс, я создал функцию для обнаружения FaceID в устройстве.

- (BOOL)canAuthenticateByFaceID {
    LAContext *context = [[LAContext alloc] init];
    if context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: &error) {
       if (context.biometryType == LABiometryTypeFaceID && @available(iOS 11.0, *)) {
        return YES;
    } else {
        return NO;
    }
  }
}

Надеюсь, это поможет другим. Удачного кодирования!!

Наконец-то я написал собственную библиотеку для определения FaceID здесь

person Aleem    schedule 25.09.2017
comment
Привет, Алим, есть ли у вас какие-либо ссылки на то, как использовать идентификатор лица для аутентификации пользователя из нашего приложения. Я проверил онлайн, но не смог найти ни одного. - person Sid; 28.09.2017
comment
В Swift я получаю 0 на любом устройстве в Симуляторе для: context.biometryType.rawValue (iPhoneX, iPhone8). Разве это не должно возвращать 2 и 1 (typeFaceID, typeTouchID) - person mica; 08.10.2017
comment
mica Я обнаружил, что проблема заключалась в том, что политика не оценивалась в первую очередь, более подробно опубликованная в ответе выше в обычный день Swift! - person Stuart P.; 01.11.2017
comment
Неверный код. Давайте посмотрим комментарий к свойству: Это свойство устанавливается только в том случае, если canEvaluatePolicy завершается успешно для биометрической политики. - person myaug; 10.11.2017
comment
canEvaluatePolicy не распространяется на то, ЕСТЬ ли устройство Face ID или нет! может еще не поставил! - person Mo Farhand; 25.09.2018

Версия, совместимая со Swift 4.

var isFaceIDSupported: Bool {
    if #available(iOS 11.0, *) {
        let localAuthenticationContext = LAContext()
        if localAuthenticationContext.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil) {
            return localAuthenticationContext.biometryType == .faceID
        }
    }
    return false
}
person rockdaswift    schedule 14.05.2018
comment
canEvaluatePolicy не распространяется на то, ЕСТЬ ли устройство Face ID или нет! может еще не поставил! - person Mo Farhand; 25.09.2018