【问题标题】:How to detect whether device support FaceID or not?如何检测设备是否支持 FaceID?
【发布时间】:2017-09-25 10:10:33
【问题描述】:

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

【问题讨论】:

标签: objective-c xcode ios11 face-id


【解决方案1】:

我发现您必须调用 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
}

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

【讨论】:

  • 我们发现如果手机有面部识别码并且它已经注册并且没问题,这个代码就可以工作。但是,如果人脸 ID 没有注册,或者它通过识别太多不正确的人脸而“锁定”,则此函数返回 false(导致我们的代码至少沿着不正确的 Touch ID 路径走)。有没有人知道一种方法来检测设备是否支持 Face ID,无论它是注册还是锁定?
  • 这在 iPhone X 模拟器上总是返回 false
  • 实际上并非总是如此:仅在未注册时。在 iPhone X 的模拟器菜单栏上,“硬件”>“Face ID”>“已注册”。
【解决方案2】:

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;
}

【讨论】:

    【解决方案3】:

    感谢 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 here you find

    【讨论】:

    • 您好 Aleem,您对如何使用人脸 ID 对我们应用程序中的用户进行身份验证有任何参考吗?我在网上查了,但没有找到。
    • 迅速我在模拟器中的任何设备上得到 0:context.biometryType.rawValue (iPhoneX, iPhone8)。不应该返回 2 和 1 (typeFaceID, typeTouchID)
    • mica 我发现问题出在没有首先评估的政策中,在普通日 Swift 中更彻底地发布在上面的答案中!
    • 代码不正确。让我们看看该属性的评论:仅当 canEvaluatePolicy 对生物识别策略成功时才设置此属性
    • canEvaluatePolicy 不覆盖设备是否有面部ID!也许它还没有设置!
    【解决方案4】:

    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
    }
    

    【讨论】:

    • canEvaluatePolicy 不覆盖设备是否有面部ID!也许它还没有设置!
    【解决方案5】:
    +(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;
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-25
      • 1970-01-01
      • 2013-11-27
      相关资源
      最近更新 更多