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")
}

Любой вклад будет оценен. Благодарю.

0 ответов

Другие вопросы по тегам