Ir para o console

Receber mensagens em um app para iOS.

Depois que o o app cliente é instalado em um dispositivo, ele recebe mensagens por meio da interface de APNs do FCM. Comece imediatamente a enviar notificações para segmentos de usuários com o Editor do Notificações ou faça o servidor do app enviar mensagens com um payload de notificação por meio da interface de APNs.

O gerenciamento de mensagens recebidas pela interface de APNs do FCM cobre, provavelmente, a maior parte dos casos de uso típicos. Para casos de uso especiais que exigem confiabilidade muito alta, você pode processar mensagens diretas do canal do FCM no seu app. Também é possível enviar mensagens upstream.

Processar mensagens recebidas pela interface de APNs do FCM

Quando o app está em segundo plano no iOS, as mensagens são direcionadas com a chave notification para a bandeja do sistema. Um toque em uma notificação abre o app, e o conteúdo dela é passado para a chamada de retorno didReceiveRemoteNotification no AppDelegate.

Implemente AppDelegate application:didReceiveRemoteNotification: como mostrado:

Swift

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
  // 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)
}

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

Objective-C

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
  // 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 message ID.
  if (userInfo[kGCMMessageIDKey]) {
    NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]);
  }

  // Print full message.
  NSLog(@"%@", userInfo);
}

- (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 message ID.
  if (userInfo[kGCMMessageIDKey]) {
    NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]);
  }

  // Print full message.
  NSLog(@"%@", userInfo);

  completionHandler(UIBackgroundFetchResultNewData);
}

Caso queira abrir seu app e realizar uma ação específica, defina click_action no payload de notificação. Use o valor utilizado para a chave category no payload de APNs.

Como interpretar o payload da mensagem de notificação

O payload das mensagens de notificação é um dicionário de chaves e valores. As mensagens de notificação enviadas por meio dos APNs seguem o formato de payload deles, como este:

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

Processar mensagens com o método Swizzling desativado

Se você desativar o método Swizzling, precisará chamar um método para permitir que o FCM acompanhe a entrega e a análise das mensagens. Isso é executado automaticamente com o método Swizzling ativado.

A partir do iOS 10, é possível definir o UNUserNotificationCenter delegate para receber notificações de exibição da Apple e a propriedade FIRMessaging delegate para receber mensagens de dados do FCM. Se esses dois objetos delegados não forem definidos com AppDelegate, o Swizzling de métodos de processamento de mensagens será desativado. Para monitorar a entrega e analisar as mensagens, chame appDidReceiveMessage:.

Objective-C: iOS 10

// 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 message ID.
  if (userInfo[kGCMMessageIDKey]) {
    NSLog(@"Message ID: %@", userInfo[kGCMMessageIDKey]);
  }

  // Print full message.
  NSLog(@"%@", userInfo);

  // Change this to your preferred presentation option
  completionHandler(UNNotificationPresentationOptionNone);
}

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

  // Print full message.
  NSLog(@"%@", userInfo);

  completionHandler();
}

Objective-C: iOS 9 e anteriores

// With "FirebaseAppDelegateProxyEnabled": NO
   - (void)application:(UIApplication *)application
     didReceiveRemoteNotification:(NSDictionary *)userInfo
           fetchCompletionHandler:
               (void (^)(UIBackgroundFetchResult))completionHandler {
   // Let FCM know about the message for analytics etc.
   [[FIRMessaging messaging] appDidReceiveMessage:userInfo];
   // handle your message.
 }
 

Swift: iOS 10

@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 message ID.
    if let messageID = userInfo[gcmMessageIDKey] {
      print("Message ID: \(messageID)")
    }

    // Print full message.
    print(userInfo)

    // Change this to your preferred presentation option
    completionHandler([])
  }

  func userNotificationCenter(_ center: UNUserNotificationCenter,
                              didReceive response: UNNotificationResponse,
                              withCompletionHandler completionHandler: @escaping () -> Void) {
    let userInfo = response.notification.request.content.userInfo
    // Print message ID.
    if let messageID = userInfo[gcmMessageIDKey] {
      print("Message ID: \(messageID)")
    }

    // Print full message.
    print(userInfo)

    completionHandler()
  }
}

Swift: iOS 9 e anteriores

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
     // Let FCM know about the message for analytics etc.
     FIRMessaging.messaging().appDidReceiveMessage(userInfo)
     // handle your message
   }
 

Processar mensagens diretas do canal do FCM

Quando o app está em primeiro plano, para receber mensagens somente de dados diretamente do FCM em vez de usar os APNs, conecte-se ao serviço do FCM e processe-as com FIRMessagingDelegate do messaging:didReceiveMessage:. Com o canal direto ativado, o back-end do FCM usa uma fila de mensagens confiável para rastrear as mensagens pendentes quando o app está em segundo plano ou fechado. Quando o app for para o primeiro plano e a conexão for restabelecida, o canal enviará automaticamente as mensagens pendentes para o cliente, até receber uma confirmação do cliente.

Para se conectar, defina a sinalização shouldEstablishDirectChannel como YES no AppDelegate. O FCM gerencia a conexão, fechando-a quando o app entra em segundo plano e reabrindo-a sempre que o app está no primeiro plano.

Além disso, defina a sinalização useMessagingDelegateForDirectChannel como YES em AppDelegate e implemente messaging:didReceiveMessage:. Seu app ainda pode receber mensagens de APNs com ou sem esse callback, mas, para mensagens diretas do FCM, você precisará dele.

Interpretar payload da mensagem de dados

O payload da mensagem de dados é um dicionário de chaves e valores. As mensagens de dados enviadas aos dispositivos diretamente pelo servidor do FCM são expressas no formato de um dicionário, como a seguir:

  {
    "body" : "great match!",
    "title" : "Portugal vs. Denmark",
    "icon" : "myicon"
  }

Gerenciar mensagens enfileiradas e excluídas

Apps que se conectam ao FCM para receber mensagens de dados devem gerenciar FIRMessagingMessagesDeletedNotification. Você poderá receber esse retorno de chamada quando houver muitas mensagens (mais de cem) pendentes para seu app em um dispositivo específico no momento em que ele se conecta ou se o dispositivo não tiver se conectado ao FCM há mais de um mês. Ao receber esse callback, a instância do app precisa executar uma sincronização completa com seu servidor do app.

Para ver insights sobre a entrega de mensagens ao seu aplicativo, consulte o painel de relatórios do FCM, que registra o número de mensagens enviadas e abertas em dispositivos iOS e Android, além de dados de impressões (notificações vistas pelos usuários) para apps Android.