Пуш-уведомление iOS Firebase не работает, но работает на пушере - PullRequest
0 голосов
/ 10 января 2019

Проблема:

Не удается получить push-уведомление для моего устройства из firebase, учитывая тот факт, что я смог получить токен устройства и токен basebase.

Вот мои основные звонки в моем AppDelegate.swift

UIApplication.shared.registerForRemoteNotifications()

Этот вызов успешен, и я могу установить соединение с APNS, потому что мне удалось получить свой токен с помощью этого вызова:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)

Кроме того, я знаю, что я подключаюсь к FireBase, потому что я могу получить свой токен FireBase с помощью этого вызова:

func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String)

Так что я вполне уверен, что мой код в AppDelegate.swift в порядке.

Вот мои шаги для настройки push-уведомления firebase:

  1. Загрузил мой файл google-service.plist и перетащил его в мой проект
  2. Войдите в мою учетную запись разработчика Apple (платно) и создайте мой ключ с push-уведомлением (скопировал KeyID и вместе с моим teamID или префиксом приложения).
  3. Зашел в мою учетную запись Firebase и загрузил мой Ключ вместе с моим KeyID и TeamID
  4. Я удостоверился, что возможности моего приложения установили переключатель push-уведомлений в положение ON
  5. Попытка отправки тестового сообщения и приложение никогда не получит

My AppDelegate.swift:

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, MessagingDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        FirebaseApp.configure()

        UIApplication.shared.applicationIconBadgeNumber = 0
        // Override point for customization after application launch.
        loggingWithSwitftyBeaverConfiguration()

        UNUserNotificationCenter.current().delegate = self

        // requesting user's permission to accpet push notification
        UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in

            if granted == true {
                log.debug("User granted push notification")
                UNUserNotificationCenter.current().delegate = self
                Messaging.messaging().delegate = self
                DispatchQueue.main.async {
                    UIApplication.shared.registerForRemoteNotifications()
                }
            } else {
                log.debug("User did not grant pn")
            }
        }
        return true
    }

    func application(_ application: UIApplication, didFailToRegisterForRemoteNotificationsWithError error: Error) {
        log.debug("Device token receiving failed because: \(error.localizedDescription)")
    }

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {

        let token = deviceToken.map {String(format: "%02.2hhx", $0)}.joined()
        log.debug("Token: \(token)")
    }

    func messaging(_ messaging: Messaging, didReceive remoteMessage: MessagingRemoteMessage) {
        log.debug("\(remoteMessage.description)")
    }

    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
        log.debug("Firebase cloud messaging token: \(fcmToken)")
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
        Messaging.messaging().shouldEstablishDirectChannel = true
    }

    func applicationDidEnterBackground(_ application: UIApplication) {
        Messaging.messaging().shouldEstablishDirectChannel = false
    }

    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {

        UIApplication.shared.applicationIconBadgeNumber += 1

        print("push notification received")

    }

}

Дополнительная информация: я смог получать тестовые уведомления с помощью пушера, просто хотел выкинуть его туда,

Спасибо

Ответы [ 3 ]

0 голосов
/ 10 января 2019

Пожалуйста, проверьте ваш груз. Это может быть причиной того, что вы не получаете уведомления. Ваша полезная нагрузка должна понравиться:

{
    "to": "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...",
    "notification": {
        "body": "great match!",
        "title": "Portugal vs. Denmark",
        "icon": "myicon"
    },
    "data": {
        "Nick": "Mario",
        "Room": "PortugalVSDenmark"
    }
}

Наличие всех данных в данных не вызывает никаких уведомлений в iOS, даже если Firebase возвращает успешный запрос, потому что перенаправленная полезная нагрузка APNS неверна. Кроме того, надлежащий способ должен заключаться в том, чтобы следовать рекомендациям полезной нагрузки GCM или FCM, а именно использовать уведомление для сообщения уведомления и данные для пользовательских пар ключ / значение.

Когда FCM отправляет данные в APNS, они преобразуют их в полезную нагрузку APN. Устанавливает значения уведомлений в теге aps, т.е.

{
    "aps" : {
        "alert" : {
            "title" : "Portugal vs. Denmark",
            "body" : "Portugal vs. Denmark",
        }
    },
    "Nick" : "Mario",
    "Room" : "PortugalVSDenmark"
}
0 голосов
/ 10 января 2019

Другое возможное преимущество - отключить Firebase Swizzling, как описано здесь: https://firebase.google.com/docs/cloud-messaging/ios/client

0 голосов
/ 10 января 2019

[Следуйте пошаговому процессу, определите здесь ..]

https://firebase.google.com/docs/cloud-messaging/ios/client

...