Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

Odbieraj wiadomości w aplikacji na iOS

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

Obsługa powiadomień o alertach

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

W systemie iOS 10 i nowszym należy ustawić delegata UNUserNotificationCenter i zaimplementować odpowiednie metody delegata, aby otrzymywać powiadomienia o wyświetlaniu z FCM.

Szybki

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

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ć do powiadomień działania niestandardowe, ustaw parametr click_action w ładunku powiadomienia . Użyj wartości, której użyjesz dla klucza category w ładunku APNs. Akcje niestandardowe muszą zostać zarejestrowane przed użyciem. Aby uzyskać więcej informacji, zobacz Przewodnik programowania lokalnych i zdalnych powiadomień firmy Apple.

Aby uzyskać wgląd w dostarczanie wiadomości do Twojej aplikacji, zapoznaj się z panelem raportowania FCM , który rejestruje liczbę wiadomości wysłanych i otwartych na urządzeniach z systemem iOS i Android wraz z danymi dotyczącymi „wyświetleń” (powiadomień widzianych przez użytkowników) w przypadku aplikacji na Androida.

Obsługa cichych powiadomień push notification

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

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

Szybki

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

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

iOS nie gwarantuje dostarczania powiadomień w tle. Aby dowiedzieć się o warunkach, które mogą powodować niepowodzenie powiadomień w tle, zapoznaj się z dokumentacją Apple dotyczącą przekazywania aktualizacji w tle do Twojej aplikacji .

Interpretowanie ładunku wiadomości z powiadomieniem

Ładunek komunikatów powiadomień to słownik kluczy i wartości. Powiadomienia wysyłane przez APNs są zgodne z formatem danych APNs, jak poniżej:

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

Obsługa wiadomości z wyłączoną metodą swizzling

Domyślnie, jeśli przypiszesz klasę delegata aplikacji aplikacji do właściwości delegata UNUserNotificationCenter i Messaging , FCM zmieni klasę delegata aplikacji, aby automatycznie skojarzyć token FCM z tokenem APN urządzenia i przekazywać zdarzenia odebrania powiadomień do usługi Analytics. Jeśli jawnie wyłączysz swizzling metody lub użyjesz oddzielnej klasy dla jednego z delegatów, będziesz musiał wykonać oba te zadania ręcznie.

Aby skojarzyć token FCM z tokenem APNs 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 otrzymanych powiadomieniach 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);
}