1

我有一个用 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")
}

任何输入将不胜感激。谢谢。

4

0 回答 0