1

当应用程序启动或何时进入前台时,我正在通过 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()
                }
            }
        }
    }

}
4

1 回答 1

3

您需要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: {

}) {

}
于 2018-12-05T12:51:51.990 回答