Как описано в опубликованной ссылке @fewlinesofcode, viewDidAppear
не запускается, когда физически появляется на экране, а запускается при добавлении в иерархию контроллера представления.Поэтому имеет смысл, что это срабатывает при запуске.
Я решил это с помощью UIApplication.shared.applicationState
, например так:
псевдо AppDelegate.swift:
func applicationWillEnterForeground(_ application: UIApplication) {
center.post(name: .ApplicationWillEnterForeground, object: self, userInfo: nil)
}
псевдо BaseViewController.swift:
class BaseViewController: UIViewController {
var applicationWillEnterForegroundObserver: NSObjectProtocol?
let center = NotificationCenter.default
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if UIApplication.shared.applicationState != .background {
authenticate()
} else {
if applicationWillEnterForegroundObserver == nil {
applicationWillEnterForegroundObserver = center.addObserver(
forName: .ApplicationWillEnterForeground,
object: nil, queue: nil) { (_) in
self.center.removeObserver(self.applicationWillEnterForegroundObserver!)
self.authenticate()
}
}
}
}
fileprivate func authenticate() {
// do authentication logic
}
}
Это проверяет viewDidAppear
, работает ли приложение в фоновом режиме (например, когда PushKit запускает приложение).Если это не так, просто авторизуйтесь и продолжайте.Если это так, запланируйте прослушиватель для applicationWillEnterForeground
, который аутентифицируется, как только приложение действительно выходит на передний план.