Не удается проверить идентификатор лица, когда пользователю отказано в использовании
Я хочу выполнять различные действия для пользователей, если устройство поддерживает 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
}
}];
}
}