6

问的有点早,但我计划专门为 FaceID 添加功能,所以在此之前我需要验证任一设备是否支持 FaceID?需要建议和帮助。提前致谢。

4

5 回答 5

11

我发现您必须先调用 canEvaluatePolicy 才能正确获取生物特征类型。如果不这样做,原始值将始终为 0。

所以像这样的东西在 Swift 3 中,在 Xcode 9.0 和 beta 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
}

您当然可以编写它只是为了查看它是否是生物特征并返回类型以及 bool 但这对于大多数人来说应该绰绰有余。

于 2017-10-31T23:58:36.067 回答
10

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;
}
于 2017-12-05T08:04:53.530 回答
5

感谢 Ashley Mills,我创建了一个函数来检测设备中的 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在这里你找到

于 2017-09-25T10:22:04.967 回答
2

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
}
于 2018-05-14T09:13:51.870 回答
0
+(BOOL)supportFaceID
{
   LAContext *myContext = [[LAContext alloc] init];
   NSError *authError = nil;
   // call this method only to get the biometryType and we don't care about the result!
   [myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError];
    NSLog(@"%@",authError.localizedDescription);
    if (@available(iOS 11.0, *)) {
    return myContext.biometryType == LABiometryTypeFaceID;
   } else {
    // Device is running on older iOS version and OFC doesn't have FaceID
    return NO;
  }
}
于 2018-09-25T14:36:52.730 回答