用户被拒绝使用时无法检查面部ID

时间:2018-01-22 13:29:15

标签: ios touch-id face-id

如果设备支持面部识别触摸ID ,我想对用户采取不同的操作。

使用面部识别时,iOS会要求使用权限。 (与Touch ID不同)。

如果用户拒绝权限,则context.biometryType返回LABiometryTypeNone。

无论如何都要检查设备支持的触摸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
  

注意:我不想使用密码验证。我只需要知道   设备支持触控ID或面部识别

3 个答案:

答案 0 :(得分:1)

使用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
            }
        }];
    }
}

答案 1 :(得分:1)

没有。如果用户拒绝使用NSFaceIDUsageDescription隐私权限提示,则LAContext的所有后续实例在biometryType被调用.none后将会canEvalutePolicy:error:属性

答案 2 :(得分:0)

为时已晚,但我希望这可以帮助遇到相同问题的任何人。

LAContext()。canEvaluatePolicy(。 deviceOwnerAuthentication ,错误:无) LAContext()。canEvaluatePolicy(。 deviceOwnerAuthenticationWithBiometrics ,错误:无)

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
}