Empfangen Sie Nachrichten in einer Apple-App

Sobald Ihre Client-App auf einem Gerät installiert ist, kann sie Nachrichten über die FCM-APNs-Schnittstelle empfangen. Sie können sofort mit dem Versenden von Benachrichtigungen an Benutzersegmente mit dem Notifications Composer oder von auf Ihrem Anwendungsserver erstellten Nachrichten beginnen.

Behandeln Sie Warnmeldungen

FCM übermittelt alle Nachrichten, die an Apple-Apps gerichtet sind, über APNs. Weitere Informationen zum Empfang von APNs-Benachrichtigungen über UNUserNotificationCenter finden Sie in der Dokumentation von Apple zum Umgang mit Benachrichtigungen und benachrichtigungsbezogenen Aktionen .

Sie müssen den UNUserNotificationCenter-Delegaten festlegen und die entsprechenden Delegatenmethoden implementieren, um Anzeigebenachrichtigungen von FCM zu erhalten.

Schnell


extension AppDelegate: UNUserNotificationCenterDelegate {
  // Receive displayed notifications for iOS 10 devices.
  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              willPresent notification: UNNotification) async
    -> UNNotificationPresentationOptions {
    let userInfo = notification.request.content.userInfo

    // With swizzling disabled you must let Messaging know about the message, for Analytics
    // Messaging.messaging().appDidReceiveMessage(userInfo)

    // ...

    // Print full message.
    print(userInfo)

    // Change this to your preferred presentation option
    return [[.alert, .sound]]
  }

  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              didReceive response: UNNotificationResponse) async {
    let userInfo = response.notification.request.content.userInfo

    // ...

    // With swizzling disabled you must let Messaging know about the message, for Analytics
    // Messaging.messaging().appDidReceiveMessage(userInfo)

    // Print full message.
    print(userInfo)
  }
}

Ziel c

// Receive displayed notifications for iOS 10 devices.
// Handle incoming notification messages while app is in the foreground.
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
       willPresentNotification:(UNNotification *)notification
         withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
  NSDictionary *userInfo = notification.request.content.userInfo;

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  // ...

  // Print full message.
  NSLog(@"%@", userInfo);

  // Change this to your preferred presentation option
  completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionAlert);
}

// Handle notification messages after display notification is tapped by the user.
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
         withCompletionHandler:(void(^)(void))completionHandler {
  NSDictionary *userInfo = response.notification.request.content.userInfo;
  if (userInfo[kGCMMessageIDKey]) {
    NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]);
  }

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  // Print full message.
  NSLog(@"%@", userInfo);

  completionHandler();
}

Wenn Sie Ihren Benachrichtigungen benutzerdefinierte Aktionen hinzufügen möchten, legen Sie den Parameter click_action in der Benachrichtigungsnutzlast fest. Verwenden Sie den Wert, den Sie für den category in der APNs-Nutzlast verwenden würden. Benutzerdefinierte Aktionen müssen registriert werden, bevor sie verwendet werden können. Weitere Informationen finden Sie im Programmierhandbuch für lokale und Remote-Benachrichtigungen von Apple.

Einblicke in die Nachrichtenübermittlung an Ihre App erhalten Sie im FCM-Berichts-Dashboard , das die Anzahl der auf Apple- und Android-Geräten gesendeten und geöffneten Nachrichten sowie Daten zu „Impressionen“ (von Benutzern gesehene Benachrichtigungen) für Android-Apps aufzeichnet.

Behandeln Sie stille Push-Benachrichtigungen

Beim Senden von Nachrichten mit dem Schlüssel „ content_available (entspricht dem Schlüssel content-available von APNs) werden die Nachrichten als stille Benachrichtigungen zugestellt, wodurch Ihre App im Hintergrund für Aufgaben wie Hintergrunddatenaktualisierung aktiviert wird. Im Gegensatz zu Vordergrundbenachrichtigungen müssen diese Benachrichtigungen über die application(_:didReceiveRemoteNotification:fetchCompletionHandler:) Methode.

Implementieren Sie application(_:didReceiveRemoteNotification:fetchCompletionHandler:) wie gezeigt:

Schnell

func application(_ application: UIApplication,
                 didReceiveRemoteNotification userInfo: [AnyHashable: Any]) async
  -> UIBackgroundFetchResult {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // Messaging.messaging().appDidReceiveMessage(userInfo)

  // Print message ID.
  if let messageID = userInfo[gcmMessageIDKey] {
    print("Message ID: \(messageID)")
  }

  // Print full message.
  print(userInfo)

  return UIBackgroundFetchResult.newData
}

Ziel c

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
    fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
  // If you are receiving a notification message while your app is in the background,
  // this callback will not be fired till the user taps on the notification launching the application.
  // TODO: Handle data of notification

  // With swizzling disabled you must let Messaging know about the message, for Analytics
  // [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  // ...

  // Print full message.
  NSLog(@"%@", userInfo);

  completionHandler(UIBackgroundFetchResultNewData);
}

Apple-Plattformen garantieren nicht die Zustellung von Hintergrundbenachrichtigungen. Weitere Informationen zu Bedingungen, die dazu führen können, dass Hintergrundbenachrichtigungen fehlschlagen, finden Sie in den Dokumenten von Apple zum Übertragen von Hintergrundaktualisierungen an Ihre App .

Interpretieren der Nutzlast der Benachrichtigungsnachricht

Die Nutzlast von Benachrichtigungsnachrichten ist ein Wörterbuch mit Schlüsseln und Werten. Über APNs gesendete Benachrichtigungsnachrichten folgen dem APNs-Nutzlastformat wie folgt:

  {
    "aps" : {
      "alert" : {
        "body" : "great match!",
        "title" : "Portugal vs. Denmark",
      },
      "badge" : 1,
    },
    "customKey" : "customValue"
  }

Behandeln Sie Nachrichten mit deaktiviertem Methoden-Swizzling

Wenn Sie die App-Delegatenklasse Ihrer App den Eigenschaften UNUserNotificationCenter und Messaging Delegaten zuweisen, wechselt FCM standardmäßig Ihre App-Delegatenklasse, um Ihr FCM-Token automatisch mit dem APNs-Token des Geräts zu verknüpfen und benachrichtigungsempfangene Ereignisse an Analytics weiterzuleiten. Wenn Sie das Methoden-Swizzling explizit deaktivieren, wenn Sie eine SwiftUI-App erstellen oder wenn Sie eine separate Klasse für einen der Delegaten verwenden, müssen Sie beide Aufgaben manuell ausführen.

Um das FCM-Token mit dem APNs-Token des Geräts zu verknüpfen, übergeben Sie das APNs-Token über die Eigenschaft apnsToken an die Messaging Klasse im Token-Aktualisierungshandler Ihres App-Delegierten.

Schnell

func application(_ application: UIApplication,
    didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
  Messaging.messaging().apnsToken = deviceToken;
}
 

Ziel c

- (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
  [FIRMessaging messaging].APNSToken = deviceToken;
}

Um Benachrichtigungsempfangsinformationen an Analytics zu übergeben, verwenden Sie die Methode appDidReceiveMessage(_:) .

Schnell

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

  Messaging.messaging().appDidReceiveMessage(userInfo)

  // Change this to your preferred presentation option
  completionHandler([[.alert, .sound]])
}

func userNotificationCenter(_ center: UNUserNotificationCenter,
                            didReceive response: UNNotificationResponse,
                            withCompletionHandler completionHandler: @escaping () -> Void) {
  let userInfo = response.notification.request.content.userInfo

  Messaging.messaging().appDidReceiveMessage(userInfo)

  completionHandler()
}

func application(_ application: UIApplication,
didReceiveRemoteNotification userInfo: [AnyHashable : Any],
   fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
  Messaging.messaging().appDidReceiveMessage(userInfo)
  completionHandler(.noData)
}

Ziel c

- (void)userNotificationCenter:(UNUserNotificationCenter *)center
       willPresentNotification:(UNNotification *)notification
         withCompletionHandler:(void (^)(UNNotificationPresentationOptions))completionHandler {
  NSDictionary *userInfo = notification.request.content.userInfo;

  [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  // Change this to your preferred presentation option
  completionHandler(UNNotificationPresentationOptionBadge | UNNotificationPresentationOptionAlert);
}

- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
         withCompletionHandler:(void(^)(void))completionHandler {
  NSDictionary *userInfo = response.notification.request.content.userInfo;

  [[FIRMessaging messaging] appDidReceiveMessage:userInfo];

  completionHandler();
}

- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {
  [[FIRMessaging messaging] appDidReceiveMessage:userInfo];
  completionHandler(UIBackgroundFetchResultNoData);
}