5

iPhone X 推出了引入 FaceID 来解锁手机和支付 Apple Pay。

我们可以访问 API 吗?

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

也许有日期吗?

4

5 回答 5

7

它实际上已经在 Xcode 9 中与 TouchID 功能相同的地方可用。 查看 LocalAuthentication -> LAContext ->LABiometryType例如。

如果您查看更高级别的文档,LAContext可以发现新的 API 当前带有“Beta”标签(大概这些将在 Xcode 9 和 iOS 11 正式发布后立即删除)。

于 2017-09-15T04:29:13.443 回答
6

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


正如@Paulw11 在评论中指出的那样,使用 Touch ID 进行身份验证的API——检查可用性,实际请求身份验证——对 Face ID 的工作方式相同。您可能会注意到,所有这些 API 从未真正提及 Touch ID,只是抽象的“生物识别”……这几乎就像 Apple 在 iOS 8 中发布该 API 时提前考虑了一样。LAContext canEvaluatePolicyevaluatePolicy

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


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

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

于 2017-09-17T07:51:02.670 回答
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, *) {...}

而且,AppleLABiometryType enum在 Xcode 9.2 中更改了名称。

于 2017-09-29T22:23:20.733 回答
3

斯威夫特 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
 }
}

编辑:

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

于 2017-11-03T16:12:45.690 回答
2

我可以确认 Xcode 9 的模拟器中存在错误。

如果我使用 Xcode 9.1 beta,此代码有效:

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很重要。

于 2017-10-26T23:38:12.613 回答