Push-уведомления Firebase

#ios #swift #firebase #apple-push-notifications #firebase-cloud-messaging

#iOS #swift #firebase #apple-push-уведомления #firebase-облако-обмен сообщениями

Вопрос:

У меня есть FCM работа, но я не могу заставить работать традиционные уведомления о баннерах.

Вот что у меня есть в моем AppDelegate.swift файле:

 import UIKit
import Firebase
import UserNotifications

@UIApplicationMain
final class AppDelegate: UIResponder {
  var window: UIWindow?

  override init() {
    super.init()    
    FIRApp.configure()
  }
}

// MARK: - UIApplicationDelegate
extension AppDelegate: UIApplicationDelegate {
  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
    let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
    UNUserNotificationCenter.current().requestAuthorization(options: authOptions, completionHandler: { _, _ in })
    UNUserNotificationCenter.current().delegate = self

    FIRMessaging.messaging().remoteMessageDelegate = self

    application.registerForRemoteNotifications()

    NotificationCenter.default.addObserver(self, selector: #selector(tokenRefreshNotification), name: .firInstanceIDTokenRefresh, object: nil)
    return true
  }

  func tokenRefreshNotification(notification: Notification) {
    if let refreshedToken = FIRInstanceID.instanceID().token() {
      print("InstanceID token: (refreshedToken)")
    }

    connectToFcm()
  }

  func connectToFcm() {
    FIRMessaging.messaging().connect { error in
      if error != nil {
        print("Unable to connect with FCM. (error)")
      } else {
        print("Connected to FCM.")
      }
    }
  }

  func applicationDidBecomeActive(_ application: UIApplication) {
    connectToFcm()
  }
}

// MARK: - UNUserNotificationCenterDelegate
extension AppDelegate: UNUserNotificationCenterDelegate {
  func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
    let userInfo = notification.request.content.userInfo

    print("Message ID: (userInfo["gcm.message_id"]!)")

    print(userInfo)

    completionHandler([.alert, .sound])
  }
}

// MARK:
extension AppDelegate: FIRMessagingDelegate {
  func applicationReceivedRemoteMessage(_ remoteMessage: FIRMessagingRemoteMessage) {
    print("FIRMessagingRemoteMessage Received: (remoteMessage.appData)")
  }
}
  

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

Однако баннеры не отображаются при отправке уведомлений. Когда приложение находится в фоновом режиме, уведомления также не отправляются — только когда приложение находится на переднем плане.

Ищу помощь. Заранее спасибо!

Комментарии:

1. Успешно ли сгенерирован токен?

2. @NaveenRamanathan Я только что создал новое свойство — let token = FIRInstanceID.instanceID().token()! и это привело к сбою. Я предполагаю, что он не был успешно сгенерирован. Однако в документах никогда не упоминался токен…

3. Токен будет сгенерирован после вызова tokenRefreshNotification. Если вы попытаетесь получить токен до того, как он будет сгенерирован, ваше приложение выйдет из строя. Вызывается ли метод tokenRefreshNotification и печатает ли токен print(«Токен InstanceID: (обновленный токен)»)?

4. Он не напечатал токен.

5. С какой версией устройства iOS вы тестируете

Ответ №1:

Попробуйте отключить метод swizzling.

Add FirebaseAppDelegateProxyEnabled to info.plist and set it to NO .

Затем добавьте этот код в делегат приложения

 func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
  FIRInstanceID.instanceID().setAPNSToken(deviceToken, type: FIRInstanceIDAPNSTokenTypeSandbox)
}
  

Удалите свое приложение с устройства и переустановите его.
пожалуйста, проверьте, вызывается ли application:didRegisterForRemoteNotificationsWithDeviceToken . Если оно вызвано, попробуйте отправить уведомление из консоли firebase.

Комментарии:

1. Сейчас работает, но я не понимаю. Разве в iOS 10 не было введено UNUserNotificationCenterDelegate запрещение использования UIApplicationDelegate методов?

2. Нет, они этого не сделали developer.apple.com/reference/uikit/uiapplicationdelegate / … . application:didregister forremotenotificationswithdevicetoken все еще используется и полностью отличается от UNUserNotificationCenterDelegate. Firebase использует метод swizzling для обработки Didregister forremotenotificationswithdevicetoken. Иногда это не работает. UNUserNotificationCenterDelegate предоставляет обратные вызовы для обработки пользовательских взаимодействий, связанных с push-уведомлением. Это происходит после получения push-уведомления. Надеюсь, это поможет.

3. Спасибо за разъяснение!