Я только начал с обмена сообщениями в 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 , но все еще не получил ее, поэтому я надеюсь, что кто-то может помочь.
Спасибо
/ Ол