如何访问新iPhone X的FaceID?

时间:2017-09-15 04:24:41

标签: ios iphone-x

iPhone X推出FaceID解锁手机并制作Apple Pay。

我们可以访问API吗?

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

或许是否有日期线?

5 个答案:

答案 0 :(得分:7)

它实际上已经在Xcode 9中可用,在同一个地方找到了TouchID功能。例如Look at LocalAuthentication -> LAContext -> LABiometryType

如果您查看更高级别的文档LAContext,则可以在" Beta"中找到新的API。它们上面的标签(大概这些将在Xcode 9和iOS 11正式发布时删除。)

答案 1 :(得分:6)

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

如上所述by @Paulw11 in comments,使用Touch ID进行身份验证的API - LAContext canEvaluatePolicy来检查可用性,evaluatePolicy实际请求身份验证 - 对于Face来说也是一样的ID。您可能会注意到所有这些API实际上都没有真正提到Touch ID,而只是抽象中的“生物识别”......这几乎就像Apple在iOS 8中发布API时一样思考。

Apple的Craig Federighi在a recent appearance on The Talk Show podcast证实了这一点。他说,他和其他携带iPhone X的Apple员工一直在运行使用这些API的现有应用程序 - 银行应用程序,航空公司应用程序等,而且他们“只使用”Face ID。相同的API调用只是自动调用新的UI,除了它通常更快,因为用户可能已经在看电话,所以他们不必做任何事情。

现在,正如@MichaelDautermann’s answer所述,还有用于区分Touch ID和Face ID的新API:LAContext biometryType告诉您当前设备支持哪种生物识别。

如果相同的API用于调用Touch ID和Face ID,为什么新的东西呢?这样你的应用就可以在用户界面中谈论它了。考虑所有银行和信用卡和密码管理器以及您曾经使用过的应用程序 - 您使用密码登录该应用程序,然后它会询问您下次是否要使用Touch ID而不是密码。所有这些都是来自这些应用程序开发人员的自定义UI,因此他们需要使用这个新API,以便他们的UI可以正确地说“使用Touch ID”或“使用Face ID”,具体取决于当前设备。

答案 2 :(得分:4)

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

API在Xcode 9.0 GM中无效。

并且,有一个影响iOS 11.0.0(iOS 11的第一个公开版本)的错误会导致biometryType功能崩溃。因此,您必须使用此检查:

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

AND,Apple更改了Xcode 9.2中的LABiometryType enum名称。

答案 3 :(得分:3)

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崩溃。

答案 4 :(得分:2)

我可以确认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非常重要。