Фоновое уведомление PushKit запускает viewDidAppear на начальном контроллере представления - PullRequest
0 голосов
/ 21 декабря 2018

Мое приложение может получать фоновые уведомления через PushKit.Эти уведомления PushKit запускают действие для очистки ранее доставленных регулярных уведомлений.

Когда я закрываю приложение и получаю уведомление PushKit, viewDidAppear запускается на моем начальном контроллере представления (как настроено в раскадровке).Это вызывает некоторые проблемы для меня.Я понимаю, что PushKit запускает ваше приложение в фоновом режиме, но я не понимаю, почему срабатывает viewDidAppear;так как приложение на самом деле никогда не открывается.

псевдо AppDelegate.swift:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    voipRegistration()
    Messaging.messaging().delegate = self

    // setup Firebase/Bugfender

    UNUserNotificationCenter.current().delegate = self
    UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) {granted, _ in
        // setup regular notifications
    }

    application.registerForRemoteNotifications()
    return true
}

func pushRegistry(_ registry: PKPushRegistry, didReceiveIncomingPushWith payload: PKPushPayload, for type: PKPushType, completion: @escaping () -> Void) {
    UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: identifiers)
}

func pushRegistry(_ registry: PKPushRegistry, didUpdate pushCredentials: PKPushCredentials, for type: PKPushType) {
    // register token with server
}

fileprivate func voipRegistration() {
    let voipRegistry = PKPushRegistry(queue: nil)

    voipRegistry.delegate = self
    voipRegistry.desiredPushTypes = [.voIP]
}

Интересно, нормально ли это поведение, что viewDidAppear запускается через PushKit?ViewDidAppear в начальном контроллере запускает мой процесс аутентификации, и я не хочу, чтобы это происходило, пока приложение находится в фоновом режиме.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Как описано в опубликованной ссылке @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, который аутентифицируется, как только приложение действительно выходит на передний план.

0 голосов
/ 21 декабря 2018

Как вы можете найти в официальной документации Apple

После получения уведомления PushKit система автоматически запускает ваше приложение, если оно не работает.Напротив, пользовательские уведомления не гарантируют запуск вашего приложения.

Так что да, это правильное поведение.

UPD: ключевым моментом является то, что приложение просыпается послеполучение уведомления PushKit.Как только приложение запускается, у него есть некоторое время выполнения, и ваш код выполняется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...