Firebase сообщение делегатов путаница - PullRequest
0 голосов
/ 30 апреля 2018

Я только начал с обмена сообщениями в Firebase и не совсем понял, как должны использоваться разные делегаты. Я сейчас использую:

UIApplicationDelegate

UNUserNotificationCenterDelegate

MessagingDelegate

Я отправляю тестовые сообщения с консоли Firebase, и они прекрасно принимаются на моем iPhone (iOS 11.3), как когда приложение находится в фоновом режиме, так и на переднем плане, но метод приема MessagingDelegate никогда не вызывается, и я не очень понимаю почему.

Это соответствующие части моего приложения:

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, MessagingDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        FirebaseApp.configure()
        Messaging.messaging().delegate = self
        Messaging.messaging().shouldEstablishDirectChannel = true

        if #available(iOS 10.0, *) {
            // For iOS 10 display notification (sent via APNS)
            UNUserNotificationCenter.current().delegate = self

            let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
            UNUserNotificationCenter.current().requestAuthorization(
                options: authOptions,
                completionHandler: {_, _ in })
        } else {
            let settings: UIUserNotificationSettings =
                UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
            application.registerUserNotificationSettings(settings)
        }

        application.registerForRemoteNotifications()
        return true
    }


    // MARK: UIApplicationDelegate method
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                     fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        print("B: \(userInfo)")
        completionHandler(UIBackgroundFetchResult.newData)
    }

    // MARK: MessagingDelegate methods
    func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) {
        print("C: \(remoteMessage.appData)")
    }

    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
        print("Firebase registration token: \(fcmToken)")
    }

    // MARK: UNUserNotificationCenterDelegate methods
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        print("D: Will present!")
        // called when app in foreground
    }

    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        print("E: Did Receive!")
        // called when app in bg
    }

} 

Как указано выше, это два метода UNUserNotificationCenterDelegate, которые вызываются, когда приложение получает уведомление (распечатка "E" в фоновом режиме и распечатка "D" в переднем плане).

Я предполагаю (хотя у меня не было возможности проверить это), что я получу распечатку "B" на iOS 9 (по крайней мере, это то, что я получу, если удаляю методы UNUserNotificationCenterDelegate).

Но как и когда я получу распечатку "С"? Когда следует использовать этот метод делегата и почему?

Я прочитал всю информацию о Firebase iOS , но все еще не получил ее, поэтому я надеюсь, что кто-то может помочь. Спасибо / Ол

...