是否可以在LAContext.evaluatePolicy
通话后以编程方式取消TouchID警告对话框?如果是的话:怎么样?
答案 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() {... }