TouchID аутентификация
У меня есть приложение, написанное на Swift, которое использует LocalAuthentication, чтобы позволить пользователям войти в приложение с TouchID или телефонным паролем. Я установил наблюдателя уведомлений для запуска блока аутентификации всякий раз, когда приложение выходит на передний план, чтобы пользователь мог повторно пройти аутентификацию. Все работает отлично, и предупреждение TouchID отображается, когда приложение выходит на передний план после того, как я нажимаю кнопку "Домой" и отправляю приложение в фоновый режим, но проблема возникает после перехода к другому приложению из моего приложения (например, уведомление любого другого приложения появляется на сверху, и он нажал, чтобы перейти к нему), а затем хотите вернуться в мое приложение:
Когда мое приложение возвращается на передний план, предупреждение TouchID отображается не так, как должно. Вместо этого мое приложение выглядит так, как будто оно не аутентифицировано (пустой tableView), и после того, как я блокирую (деаутентифицирую) и разблокирую (аутентифицирую), для принудительной аутентификации я получаю серию предупреждений с указанием "Отменено другой аутентификацией" и как минимум 2 TouchID. оповещения.
Мне кажется, что предупреждение TouchID срабатывает, но остается скрытым, а затем отменяется действием блокировки / разблокировки, чтобы вызвать другое.
У кого-нибудь была подобная проблема?
Вот некоторый код, связанный с этой проблемой:
override func viewDidLoad() {
super.viewDidLoad()
defaults.set(false, forKey: "authenticated")
NotificationCenter.default.addObserver(forName: NSNotification.Name.UIApplicationWillEnterForeground, object: nil, queue: nil, using: {_ in
self.navigationController?.popToRootViewController(animated: true)
self.accounts = []
self.tableView.reloadData()
self.authenticateUser()
self.defaults.set(false, forKey: "authenticated")
})}
func authenticateUser() {
let context = LAContext()
var error: NSError?
let reason = "Identify yourself"
if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {
print("canEvaluateWithTouchID")
context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason:
reason, reply: {success, error in
print("EvaluateWithTouchID")
// Touch ID
DispatchQueue.main.async {
if success {
self.navigationItem.rightBarButtonItem?.isEnabled = true
self.searchBar.isUserInteractionEnabled = true
self.fetchFromCoreData()
self.defaults.set(true, forKey: "authenticated")
print("Success: TouchID")
} else {
self.defaults.set(false, forKey: "authenticated")
self.accounts = []
self.navigationItem.rightBarButtonItem?.isEnabled = false
self.searchBar.isUserInteractionEnabled = false
self.lockButton.title = "Unlock"
self.tableView.reloadData()
switch error!._code {
case Int(kLAErrorAuthenticationFailed):
self.loginAlert(message: error!.localizedDescription)
print("AuthFailed1")
case Int(kLAErrorUserCancel):
self.loginAlert(message: error!.localizedDescription)
print("UserCanceled1")
case Int(kLAErrorBiometryNotEnrolled):
self.loginAlert(message: error!.localizedDescription)
print("biometry1")
case Int(kLAErrorPasscodeNotSet):
self.userFallbackPasswordAlertWith(error: error!)
print("PassNotSet1")
case Int(kLAErrorSystemCancel):
self.loginAlert(message: error!.localizedDescription)
print("SystemCancel1")
case Int(kLAErrorUserFallback):
self.userFallbackPasswordAlertWith(error: error!)
print("UserFallback1")
default:
self.userFallbackPasswordAlertWith(error: error!)
print("default1")
}
}
}
})
} else {
print("canEvaluateWithPasscode")
context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: reason, reply: {success, error in
print("EvaluateWithPasscode")
//No Touch ID
DispatchQueue.main.async {
if success {
self.navigationItem.rightBarButtonItem?.isEnabled = true
self.searchBar.isUserInteractionEnabled = true
self.lockButton.title = "Lock"
self.fetchFromCoreData()
self.defaults.set(true, forKey: "authenticated")
} else {
self.defaults.set(false, forKey: "authenticated")
self.accounts = []
self.navigationItem.rightBarButtonItem?.isEnabled = false
self.searchBar.isUserInteractionEnabled = false
self.lockButton.title = "Unlock"
self.tableView.reloadData()
switch error!._code{
case Int(kLAErrorAuthenticationFailed):
self.loginAlert(message: error!.localizedDescription)
print("AuthFailed2")
case Int(kLAErrorUserCancel):
self.loginAlert(message: error!.localizedDescription)
print("UserCanceled2")
case Int(kLAErrorBiometryNotEnrolled):
self.loginAlert(message: error!.localizedDescription)
print("biometry2")
case Int(kLAErrorPasscodeNotSet):
self.userFallbackPasswordAlertWith(error: error!)
print("PassNotSet2")
case Int(kLAErrorSystemCancel):
self.loginAlert(message: error!.localizedDescription)
print("SystemCancel2")
case Int(kLAErrorUserFallback):
self.userFallbackPasswordAlertWith(error: error!)
print("UserFallback2")
default:
self.userFallbackPasswordAlertWith(error: error!)
print("default2")
}
}
}
})
}
}
@IBAction func lockButton(_ sender: UIBarButtonItem) {
accounts = []
tableView.reloadData()
if lockButton.title == "Unlock" {
authenticateUser()
}
if lockButton.title == "Lock" {
lockButton.title = "Unlock"
}
defaults.set(false, forKey: "authenticated")
}
Любой вклад будет оценен. Благодарю.