Odbieranie wiadomości w aplikacji Apple

Gdy aplikacja klienta zostanie zainstalowana na urządzeniu, będzie mogła odbierać wiadomości za pomocą interfejsu FCM APN. Możesz od razu zacząć wysyłać powiadomienia do segmentów użytkowników za pomocą narzędzia do tworzenia powiadomień lub wiadomości utworzonych na serwerze aplikacji.

Obsługa powiadomień o alertach

FCM dostarcza wszystkie wiadomości kierowane do aplikacji Apple za pomocą APN. Więcej informacji o otrzymywaniu powiadomień APN przez UNUserNotificationCenter znajdziesz w dokumentacji Apple Zarządzanie powiadomieniami i działaniami związanymi z powiadomieniami.

Aby otrzymywać powiadomienia wyświetlane przez FCM, musisz ustawić delegata UNUserNotificationCenter i zaimplementować odpowiednie metody delegata.

Swift


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

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

Jeśli chcesz dodać do powiadomień działania niestandardowe, w danych powiadomienia ustaw parametr click_action. Użyj wartości, której używasz w kluczu category w danych APN. Przed użyciem działań niestandardowych należy je zarejestrować. Więcej informacji znajdziesz w przewodniku Apple dotyczącym programowania powiadomień lokalnych i zdalnych.

Aby uzyskać informacje o dostarczaniu wiadomości do aplikacji, otwórz FCM panel raportowania, który zawiera informacje o liczbie wiadomości wysłanych i otwartych na urządzeniach Apple i Android, a także dane o wyświetleniach (powiadomieniach wyświetlanych użytkownikom) aplikacji na Androida.

Obsługa wyciszonych powiadomień push

Gdy wysyłasz wiadomości za pomocą klucza content-available (odpowiadającego kluczowi content-available w usłudze APN), wiadomości są dostarczane jako powiadomienia bezdźwiękowe, które budzą aplikację w tle do wykonywania zadań takich jak odświeżanie danych w tle. W przeciwieństwie do powiadomień na pierwszym planie te powiadomienia muszą być obsługiwane za pomocą metody application(_:didReceiveRemoteNotification:fetchCompletionHandler:).

Wdróż application(_:didReceiveRemoteNotification:fetchCompletionHandler:) w ten sposób:

Swift

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
}

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

Platformy Apple nie gwarantują dostarczania powiadomień w tle. Informacje o warunkach, które mogą powodować niepowodzenie powiadomień w tle, znajdziesz w dokumentacji Apple dotyczącej przesyłania powiadomień w tle do aplikacji.

Interpretowanie ładunku wiadomości powiadomienia

Ładunek wiadomości powiadomienia to słownik kluczy i wartości. Wiadomości z powiadomieniami wysyłane przez APNs mają format ładunku APNs:

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

Obsługa wiadomości z wyłączonym mieszaniem metod

Domyślnie, jeśli przypiszesz klasę zastępczą aplikacji do właściwości zastępczych UNUserNotificationCenterMessaging, usługa FCM automatycznie powiąże Twój token FCM z tokenem APN urządzenia i przekaże zdarzenia otrzymania powiadomienia do usługi Analytics. Jeśli wyłączysz zamianę metody, tworzysz aplikację SwiftUI lub używasz osobnej klasy dla każdego delegowanego obiektu, musisz wykonać oba te zadania ręcznie.

Aby powiązać token FCM z tokenem APNs urządzenia, przekaż token APNs do klasy Messagingobiekcie token refresh handler delegata aplikacji za pomocą właściwości apnsToken.

Swift

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

Objective-C

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

Aby przekazać informacje o otrzymaniu powiadomienia do Analytics, użyj metody appDidReceiveMessage(_:).

Swift

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

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