Как использовать touchIDAuthenticationAllowableReuseDuration
Я аутентифицирую пользователя через 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 ответ
Вы должны использовать то же самое 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: {
}) {
}