Odbieranie wiadomości w aplikacji Apple

Po zainstalowaniu aplikacji klienckiej na urządzeniu może ona odbierać wiadomości przez interfejs APNs FCM. 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 na aplikacje Apple przy użyciu punktów APN. Aby dowiedzieć się więcej o otrzymywaniu powiadomień APNs przez UNUser NotificationCenter, zapoznaj się z dokumentacją firmy Apple w artykule Obsługa powiadomień i działań związanych z powiadomieniami.

Musisz ustawić delegat UNUserPowiadomCenter i zaimplementować odpowiednie metody przekazywania powiadomień z FCM.

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, ustaw parametr click_action w ładunku powiadomień. Użyj wartości, której użyjesz jako klucza category w ładunku APNs. Działania niestandardowe muszą być zarejestrowane, aby można było ich używać. Więcej informacji znajdziesz w przewodniku Apple na temat programowania powiadomień lokalnych i zdalnych.

Informacje o dostarczaniu wiadomości do Twojej aplikacji znajdziesz w panelu raportowania FCM, który rejestruje liczbę wysłanych i otwartych wiadomości na urządzeniach Apple i z Androidem oraz dane o „wyświetleniach” (powiadomieniach widocznych dla użytkowników) w aplikacjach na Androida.

Obsługa cichych powiadomień push

Podczas wysyłania wiadomości za pomocą klucza content-available (odpowiednik content-available APN-ów) wiadomości będą dostarczane jako powiadomienia ciche, wybudzając aplikację w tle w przypadku zadań takich jak odświeżanie danych w tle. W przeciwieństwie do powiadomień działających na pierwszym planie powiadomienia te muszą być obsługiwane za pomocą metody application(_:didReceiveRemoteNotification:fetchCompletionHandler:).

Wdróż application(_:didReceiveRemoteNotification:fetchCompletionHandler:) w następujący 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ć błędy powiadomień w tle, znajdziesz w dokumentacji Apple w artykule Przekazywanie aktualizacji w tle do aplikacji.

Interpretowanie ładunku wiadomości z powiadomieniem

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

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

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

Domyślnie, jeśli przypiszesz klasę delegowania aplikacji do usług z przekazanym dostępem do aplikacji UNUserNotificationCenter i Messaging, FCM automatycznie zakłóci tę klasę, aby automatycznie powiązać token FCM z tokenem APNs urządzenia i przekazywać zdarzenia otrzymania powiadomień do Analytics. Jeśli jawnie wyłączysz przesuwanie metod, jeśli tworzysz aplikację w SwiftUI lub jeśli używasz osobnej klasy dla każdego z przedstawicieli, musisz wykonać obie te czynności ręcznie.

Aby powiązać token FCM z tokenem APNs urządzenia, przekaż token APNs do klasy Messaging w obsłudze odświeżania tokena przedstawiciela 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 przekazywać do Analytics informacje o rachunkach powiadomień, 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);
}