iOS以编程方式取消TouchID身份validation对话框

LAContext.evaluatePolicy调用之后,是否可以以编程方式取消TouchID警报对话框? 如果是的话:怎么样?

并非每个Apple发布的API都会将其放入developer.apple.com(或Xcode的docs viewer)中的文档中。 API差异列出公共API,因此您在头文件中看到的任何内容(请参阅LocalAuthentication/LAContext.h )和从这些头生成的Swift接口。 标题中的任何内容都是公共API,因此您可以随意调用它。

有时(但不总是)未记录的API有很好的标题注释解释如何使用它们…谢天谢地, LAContext.invalidate()就是其中之一:

 /// Invalidates the context. /// /// @discussion The context is invalidated automatically when it is (auto)released. This method /// allows invalidating it manually while it is still in scope. /// /// Invalidation terminates any existing policy evaluation and the respective call will /// fail with LAErrorAppCancel. After the context has been invalidated, it can not be /// used for policy evaluation and an attempt to do so will fail with LAErrorInvalidContext. /// /// Invalidating a context that has been already invalidated has no effect. @available(iOS 9.0, *) public func invalidate() 

实际上,看起来在触摸ID警报可见时调用invalidate()应该忽略它。 (我没有试过自己。)


iOS 11更新:请注意,在具有Face ID而非Touch ID的设备上,调用LAContext.evaluatePolicy时出现的类似警报/ HUD的UI不需要或不允许交互,并且在成功进行身份validation后会自行解除。 从理论上讲, invalidate呼叫仍然会将其解除(或者如果Face ID无法识别用户,则会显示后续实际交互式警报)。

但是,假设在所有可能的设备和身份validation方法上,您总是有足够的时间在请求后取消LAContext身份validation,这可能并不明智。