6

如果设备支持Face IDTouch ID,我想对用户采取不同的操作。

使用Face ID时,iOS 要求使用权限。(与触控 ID 不同)。

如果用户拒绝许可,context.biometryType 返回 LABiometryTypeNone。

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

4

3 回答 3

1

否。如果用户使用 拒绝隐私权限提示,则NSFaceIDUsageDescription所有未来的实例都LAContext将有一个biometryType属性on 它们.nonecanEvalutePolicy:error:调用。

于 2018-04-13T06:44:28.490 回答
1

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

LAContext().canEvaluatePolicy( .deviceOwnerAuthentication,错误:nil) LAContext().canEvaluatePolicy( .deviceOwnerAuthenticationWithBiometrics,错误:nil)

deviceOwnerAuthenticationdeviceOwnerAuthenticationWithBiometrics之间的区别是第一个会告诉您设备是否具有身份验证方法.. 第二个具有相同的行为,但只有用户接受了许可才有效。

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
}
于 2020-01-06T08:21:59.140 回答
0

使用 的属性biometryTypeLAContext检查和评估可用的生物识别策略。(对于密码认证,当生物识别失败时,使用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
            }
        }];
    }
}
于 2018-01-22T13:47:06.223 回答