iPhone X 推出了引入 FaceID 来解锁手机和支付 Apple Pay。
我们可以访问 API 吗?
我知道上次我们必须等到 TouchID 发布给开发人员。
也许有日期吗?
它实际上已经在 Xcode 9 中与 TouchID 功能相同的地方可用。 查看 LocalAuthentication -> LAContext ->LABiometryType
例如。
如果您查看更高级别的文档,LAContext
可以发现新的 API 当前带有“Beta”标签(大概这些将在 Xcode 9 和 iOS 11 正式发布后立即删除)。
这里有一个评论和一个答案,每个都只讲述了故事的一部分,所以让我们把它们放在一起:
正如@Paulw11 在评论中指出的那样,使用 Touch ID 进行身份验证的API——检查可用性,实际请求身份验证——对 Face ID 的工作方式相同。您可能会注意到,所有这些 API 从未真正提及 Touch ID,只是抽象的“生物识别”……这几乎就像 Apple 在 iOS 8 中发布该 API 时提前考虑了一样。LAContext
canEvaluatePolicy
evaluatePolicy
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”。
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 中更改了名称。
斯威夫特 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
我可以确认 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很重要。