Pu sh уведомления иногда вызывают didFinishLaunchingWithOptions вместо didReceiveRemoteNotification - PullRequest
0 голосов
/ 30 января 2020

У меня есть приложение, работающее на iOS 13, которое получает уведомления pu sh, которые содержат как предупреждающее сообщение, так и доступный контент (для фоновой загрузки контента). Но я заметил проблему, из-за которой некоторые фоновые загрузки никогда не запускаются.

Просматривая в своих журналах, я вижу, что большую часть времени application(_:didReceiveRemoteNotification:fetchCompletionHandler:) вызывается по назначению, и загрузки начинаются.

Но иногда (даже в полночь, когда телефон не используется) вместо этого он выбирает application(_:didFinishLaunchingWithOptions:) с полезной нагрузкой pu sh. В этом случае didReceiveRemoteNotification вообще не вызывается.

Вот мои вопросы:

  1. Это предполагаемое поведение? Документация немного расплывчата, но звучит так, будто didReceiveRemoteNotification следует вызывать в каждом случае.
  2. Я не против начать загрузку в didFinishLaunchingWithOptions, если это то, что нужно, но этот метод также вызывается, когда пользователь просто нажимает на пу sh. Могу ли я увидеть разницу между этими двумя случаями?

У меня включен фоновый режим «Удаленные уведомления», и полезная нагрузка pu sh обычно выглядит следующим образом:

"aps": {
    "alert": {
        "loc-args": [
            "Name",
            "Description"
        ],
        "loc-key": "new_release_body",
        "title-loc-args": {
        },
        "title-loc-key": "new_release_title"
    },
    "category": "NEW_RELEASE",
    "content-available": 1,
    "mutable-content": 1
}

Спасибо!

Ответы [ 3 ]

0 голосов
/ 30 января 2020

если ваше приложение в настроении переднего плана, оно будет вызывать didFinishWithOptions. Вы должны позвонить

    func userNotificationCenter(_ center: UNUserNotificationCenter,
                            willPresent notification: UNNotification,
                            withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    let userInfo = notification.request.content.userInfo
    let payload = NotificationPayload(notification_type:notification_type)
    self.handleWillPresentNotifications(payload: payload)
    completionHandler([.alert, .badge, .sound])
}

, после этого вам нужно написать следующие строки в didFini sh

        UNUserNotificationCenter.current().requestAuthorization(options: authOptions) { (_, error) in
        guard error == nil else{
            print(error!.localizedDescription)
            return
        }
    }
    application.registerForRemoteNotifications()

// Это новый делегат, который вам необходимо реализовать также в своем appDelegate файл.

    func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { print("Recived: \(userInfo)") completionHandler(.NewData) }
0 голосов
/ 10 февраля 2020

В конце концов я решил обработать уведомления pu sh в application(_:didFinishLaunchingWithOptions:) и application(_:didReceiveRemoteNotification:fetchCompletionHandler:).

Если приложение запущено с удаленным уведомлением (а applicationState равно .background - означает, что оно не будет вызвано нажатием на уведомление pu sh) Я пытаюсь начать загрузку так же, как обычно, когда уведомление pu sh получено через applicationDidReceiveRemoteNotification.

Ниже некоторый псевдокод, который я запустил в производстве и посмотрю, как он работает. Результаты при тестировании отличные.

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool {
    let remoteNotification = launchOptions?[UIApplication.LaunchOptionsKey.remoteNotification] as? [AnyHashable: Any], application.applicationState == .background {
        handleRemoteNotification(userInfo: remoteNotification)
    }

    return true
}

public func applicationDidReceiveRemoteNotification(with userInfo: [AnyHashable: Any], completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
    handleRemoteNotification(userInfo: userInfo, completionHandler: completionHandler)
}

private func handleRemoteNotification(userInfo: [AnyHashable: Any], completionHandler: ((UIBackgroundFetchResult) -> Void)? = nil) {
    // A shared function that handles push notification and starts a download
}
0 голосов
/ 30 января 2020

Если пользователь убил приложение вручную, Apple не будет будить ваше приложение в фоновом режиме, пока пользователь не запустит приложение снова или не перезапустит свое устройство.

Может быть, случаи, когда вы получили те в didFinishLaunching если вы убили свое приложение, то когда вы снова откроете приложение, вы его там получите? Или, может быть, вы убили приложение, но затем перезапустили устройство?

https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623013-application#discussion

...