Catch up on highlights from Firebase at Google I/O 2023. Learn more

Odbieraj wiadomości w aplikacji Apple

Po zainstalowaniu aplikacji klienckiej na urządzeniu może ona odbierać wiadomości za pośrednictwem interfejsu APN FCM. Możesz natychmiast rozpocząć wysyłanie powiadomień do segmentów użytkowników za pomocą kompozytora powiadomień lub wiadomości zbudowanych na serwerze aplikacji.

Obsługuj powiadomienia o alertach

FCM dostarcza wszystkie wiadomości kierowane do aplikacji Apple za pośrednictwem APN. Aby dowiedzieć się więcej o otrzymywaniu powiadomień APN za pośrednictwem UNUserNotificationCenter, zapoznaj się z dokumentacją firmy Apple dotyczącą obsługi powiadomień i działań związanych z powiadomieniami .

Musisz ustawić delegata UNUserNotificationCenter i zaimplementować odpowiednie metody delegowania, aby otrzymywać powiadomienia o wyświetlaniu z FCM.

Szybki


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

Cel 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ć akcje niestandardowe do powiadomień, ustaw parametr click_action w ładunku powiadomienia . Użyj wartości, której użyłbyś dla klucza category w ładunku APNs. Akcje niestandardowe muszą zostać zarejestrowane, zanim będzie można ich użyć. Aby uzyskać więcej informacji, zobacz Przewodnik programowania lokalnych i zdalnych powiadomień firmy Apple.

Wgląd w dostarczanie wiadomości do Twojej aplikacji znajdziesz w panelu raportowania FCM , który rejestruje liczbę wiadomości wysłanych i otwartych na urządzeniach Apple i Android, a także dane dotyczące „wyświetleń” (powiadomień widzianych przez użytkowników) dla aplikacji na Androida.

Obsługuj ciche powiadomienia push

Podczas wysyłania wiadomości z kluczem content_available (odpowiednik klucza APN content-available , wiadomości będą dostarczane jako ciche powiadomienia, budząc aplikację w tle do zadań takich jak odświeżanie danych w tle. W przeciwieństwie do powiadomień na pierwszym planie, te powiadomienia muszą być obsługiwane przez application(_:didReceiveRemoteNotification:fetchCompletionHandler:) metoda.

Zaimplementuj application(_:didReceiveRemoteNotification:fetchCompletionHandler:) jak pokazano:

Szybki

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
}

Cel 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. Aby dowiedzieć się więcej o warunkach, które mogą powodować niepowodzenie powiadomień w tle, zobacz dokumentację firmy Apple dotyczącą przekazywania aktualizacji aplikacji w tle .

Interpretacja ładunku komunikatu powiadomienia

Ładunek powiadomień to słownik kluczy i wartości. Komunikaty powiadomień wysyłane przez APN są zgodne z poniższym formatem ładunku APN:

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

Obsługuj komunikaty z wyłączonym przełączaniem metod

Domyślnie, jeśli przypiszesz klasę pełnomocnika aplikacji do właściwości delegata UNUserNotificationCenter i Messaging , FCM zmieni klasę pełnomocnika aplikacji, by automatycznie powiązać token FCM z tokenem APN urządzenia i przekazywać zdarzenia odebrane z powiadomieniami do Analytics. Jeśli jawnie wyłączysz przełączanie metod, jeśli tworzysz aplikację SwiftUI lub jeśli używasz oddzielnej klasy dla dowolnego delegata, będziesz musiał wykonać oba te zadania ręcznie.

Aby powiązać token FCM z tokenem APN urządzenia, przekaż token APNs do klasy Messaging w procedurze obsługi odświeżania tokenu delegata aplikacji za pomocą właściwości apnsToken .

Szybki

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

Cel C

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

Aby przekazać informacje o odbiorze powiadomień do Analytics, użyj metody appDidReceiveMessage(_:) .

Szybki

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

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