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

时间:2015-12-14 20:54:49

标签: ios touch-id

是否可以在LAContext.evaluatePolicy通话后以编程方式取消TouchID警告对话框?如果是的话:怎么样?

2 个答案:

答案 0 :(得分:12)

并非每个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()

事实上,在Touch ID警报可见的情况下调用invalidate()似乎应该将其解除。 (我没有试过自己。)

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

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

答案 1 :(得分:0)

在我的情况下,我找出了为什么它不起作用的原因,因为我尝试使invalidate()的LAContext实例与我称为valuatePolicy()的实例不同。

因此,您需要确保所有ViewController共享同一实例。 迅速4

Array
(
[0] => Array
    (
        [name] => Peter
        [age] => 40
        [location] => USA
        [brand] => Hero
        [cc] => 150
        [rpm] => 8500
    )

[1] => Array
    (
        [name] => Mike
        [age] => 55
        [location] => USA
        [brand] => Honda
        [cc] => 150
        [rpm] => 9500
    )
)

在SomeViewController.swift中

public class MyBiometryUtility: NSObject {
static private var sharedBiometry: MyBiometryUtility? = nil
var context: LAContext = LAContext()
@objc public static func sharedInstance() -> MyBiometryUtility{
        if let sharedBiometry = sharedBiometry {
            return sharedBiometry;
        } else{
            sharedBiometry = MyBiometryUtility()
            return sharedBiometry!
        }
    }
public func tryBiometryAuth() { ... }
public func closeBiometryAuth() {... }