如何使用touchIDAuthenticationAllowableReuseDuration

时间:2018-12-05 10:52:21

标签: ios swift localauthentication

我正在通过LAContext在启动应用程序或何时进入前台时对用户进行身份验证。如果设备被锁定,则将要求用户两次授权自己。为了避免这种行为,我将context.touchIDAuthenticationAllowableReuseDuration值设置为240,但是它没有按预期工作。用户仍然必须两次授权自己。 我在做什么错了?


import LocalAuthentication

class AccessControl {

    internal var context = LAContext()
    private var policy: LAPolicy = .deviceOwnerAuthentication
    private var reason: String = NSLocalizedString("auhenticationLocalizedFallbackTitle", comment: "")

    init() {
        context.touchIDAuthenticationAllowableReuseDuration = 240
    }

    func evaluateUserWithBiometricsOrPasscode(success: @escaping () -> Void, error: @escaping () -> Void) {

        guard context.canEvaluatePolicy(policy, error: nil) else {
            error()
            return
        }
        context.evaluatePolicy(policy, localizedReason: reason) { eStatus, eError in
            DispatchQueue.main.async {
                if eStatus {
                    success()
                } else {
                    error()
                }
            }
        }
    }

}

1 个答案:

答案 0 :(得分:0)

您需要每次都使用相同的LAContext对象才能获得该行为。

class AccessControl {

    // MARK: - Singleton
    public static let shared = AccessControl()

    // Policy
    private var policy: LAPolicy = .deviceOwnerAuthentication

    // Reason
    private var reason: String = NSLocalizedString("auhenticationLocalizedFallbackTitle", comment: "")

    // Context
    lazy var context: LAContext = {
        let mainContext = LAContext()
        if #available(iOS 9.0, *) {
            // specify your interval
            mainContext.touchIDAuthenticationAllowableReuseDuration = 60
        }
        return mainContext
    }()


    // Evaluate
    func evaluateUserWithBiometricsOrPasscode(success: @escaping () -> Void, error: @escaping () -> Void) {

        guard context.canEvaluatePolicy(policy, error: nil) else {
            error()
            return
        }
        context.evaluatePolicy(policy, localizedReason: reason) { eStatus, eError in
            DispatchQueue.main.async {
                if eStatus {
                    success()
                } else {
                    error()
                }
            }
        }
    }
}

并按如下所示调用此函数:。这也适用于 FaceID身份验证

AccessControl.shared.evaluateUserWithBiometricsOrPasscode(success: {

}) {

}