Как использовать touchIDAuthenticationAllowableReuseDuration - PullRequest
0 голосов
/ 05 декабря 2018

Я аутентифицирую пользователя через 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 голосов
/ 05 декабря 2018

Вам необходимо использовать один и тот же объект 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: {

}) {

}
...