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 Senden von Benachrichtigungen an Benutzersegmente mit dem Benachrichtigungs-Composer oder auf Ihrem Anwendungsserver erstellten Nachrichten beginnen.

Behandeln Sie Warnmeldungen

FCM übermittelt alle Nachrichten, die auf Apple-Apps abzielen, über APNs. Weitere Informationen zum Empfangen von APNs-Benachrichtigungen über UNUserNotificationCenter finden Sie in der Apple-Dokumentation zum Umgang mit Benachrichtigungen und Benachrichtigungsbezogenen Aktionen .

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

Schnell

@available(iOS 10, *)
extension AppDelegate: UNUserNotificationCenterDelegate {
  // Receive displayed notifications for iOS 10 devices.
  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              willPresent notification: UNNotification,
                              withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions)
                                -> Void) {
    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
    completionHandler([[.alert, .sound]])
  }

  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              didReceive response: UNNotificationResponse,
                              withCompletionHandler completionHandler: @escaping () -> Void) {
    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)

    completionHandler()
  }
}

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 entfernte Benachrichtigungen von Apple.

Einen Einblick 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 aufzeichnet, zusammen mit Daten für „Impressionen“ (von Benutzern gesehene Benachrichtigungen) für Android-Apps.

Behandeln Sie stille Push-Benachrichtigungen

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

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

Schnell

func application(_ application: UIApplication,
                 didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult)
                   -> Void) {
  // 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)

  completionHandler(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. Informationen zu Bedingungen, die dazu führen können, dass Hintergrundbenachrichtigungen fehlschlagen, finden Sie in der Apple-Dokumentation zum Pushen von Hintergrundaktualisierungen an Ihre App .

Interpretieren der Nutzlast der Benachrichtigungsnachricht

Die Nutzlast von Benachrichtigungsmeldungen ist ein Wörterbuch aus Schlüsseln und Werten. Benachrichtigungsmeldungen, die über APNs gesendet werden, folgen dem APNs-Nutzdatenformat wie folgt:

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

Behandeln Sie Nachrichten mit deaktiviertem Methodenwechsel

Wenn Sie die App-Delegatklasse Ihrer App den UNUserNotificationCenter und Messaging -Delegateigenschaften zuweisen, swizzelt FCM standardmäßig Ihre App-Delegatklasse, um Ihr FCM-Token automatisch mit dem APNs-Token des Geräts zu verknüpfen und Benachrichtigungsempfangsereignisse an Analytics weiterzuleiten. Wenn Sie Methoden-Swizzling explizit deaktivieren oder eine separate Klasse für einen der beiden Delegaten verwenden, müssen Sie diese beiden Aufgaben manuell ausführen.

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

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;
}

Verwenden Sie die Methode appDidReceiveMessage(_:) , um Informationen zum Erhalt von Benachrichtigungen an Analytics zu übergeben.

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);
}