如何为新 iPhone X 访问 FaceID?

How to access FaceID for new iPhone X?

iPhone X 即将推出 FaceID 以解锁 phone 并使用 Apple Pay。

我们可以访问 API 吗?

我知道上次我们必须等到 TouchID 发布给开发者。

大概什么时候有日期线?

它实际上已经在 Xcode 9 中可用,与发现 TouchID 功能的位置相同。 Look at LocalAuthentication -> LAContext -> LABiometryType 例如。

如果您查看更高级别的文档,LAContext,目前可以找到新的 API,上面带有 "Beta" 标签(大概这些将是Xcode 9 和 iOS 11 正式发布后立即删除。

这里有一个评论和一个答案,每一个都只讲述了部分故事,所以让我们把它们放在一起:


如前所述 , the APIs for authenticating with Touch ID — LAContext canEvaluatePolicy to check for availability, evaluatePolicy 实际请求身份验证 - 与 Face ID 的工作方式相同。您可能会注意到,所有这些 API 从未真正提到 Touch ID,只是抽象的“生物识别技术”……这几乎就像 Apple 在 [=] 发布 API 时在超前思考一样30=] 8.

Apple 的 Craig Federighi 在 a recent appearance on The Talk Show podcast 中证实了这一点。他说,他和其他携带 iPhone X 的 Apple 员工已经 运行 现有应用程序——银行应用程序、航空公司应用程序等——使用这些 APIs,他们“只是工作”面部识别码。相同的 API 调用会自动调用新的 UI,只是它通常更快,因为用户可能已经在查看 phone,因此他们无需执行任何操作。


现在, notes, there are also new APIs for distinguishing Touch ID from Face ID: LAContext biometryType 告诉您当前设备支持哪种生物识别技术。

如果相同的 API 可以同时调用 Touch ID 和 Face ID,为什么还有新功能?这样您的应用程序就可以在您的 UI 中谈论它。想一想所有银行、信用卡和密码管理器以及您曾经使用过的诸如此类的应用程序——您使用密码登录到该应用程序,然后它会询问您是否要在下次使用 Touch ID 而不是密码。所有这些都是这些应用程序开发人员自定义的 UI,因此他们需要使用这个新的 API,这样他们的 UI 才能正确地说“使用 Touch ID”或“使用 Face ID” ” 取决于当前设备。

Xcode 9.0.1 和 9.1 beta (9B37) 对 Face ID 提供了工作支持。

API 在 Xcode 9.0 GM 中不起作用。

并且,有一个错误会影响 iOS 11.0.0(iOS 11 的第一个 public 版本),这将导致 biometryType 函数碰撞。因此,您必须使用此检查:

if #available(iOS 11.0.1, *) {...}

并且,Apple 在 Xcode 9.2 中更改了 LABiometryType enum 名称。

我可以确认 Xcode 9.

的模拟器中存在错误

如果我使用 Xcode 9.1 beta,This code 有效:

let authenticationContext = LAContext()
var error: NSError? = nil

if #available(iOS 11.0, *) {
    if authenticationContext.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: &error) {
        let bioType = authenticationContext.biometryType
        if bioType == .typeFaceID {
            touchIDButton.setImage(UIImage(named:"FaceIDLogo"), for: UIControlState.normal)
            touchIDButton.setImage(UIImage(named:"FaceIDLogo-Highlight"), for: UIControlState.highlighted)
        }
    }
}

我要注意,在检查生物识别类型之前 运行 LAContext.canEvaluatePolicy 很重要。

Swift 4

enum BioType {
case kFace
case kTouch
case kNone
}

func checkForBiometry() -> BioType {
    let context = LAContext()

               if #available(iOS 11.0, *),context.responds(to: #selector(getter: LAContext.biometryType))  {
            if context.biometryType == .typeFaceID {

                return .kFace
        }
        return .kTouch
    }
    return .kNone
 }
}

编辑:

添加 responds(to: #selector) 检查应用程序在 iOS 11.0.0 设备上崩溃 -[LAContext biometryType]: unrecognized selector