Recibe mensajes en una app para iOS

Una vez instalada en el dispositivo, la app cliente puede recibir mensajes mediante la interfaz del APNS en FCM. Puedes comenzar a enviar notificaciones a segmentos de usuarios de inmediato mediante el compositor de Notifications. El servidor de aplicaciones también puede enviar mensajes con una carga útil de notificación mediante la interfaz del APNS.

La administración de mensajes recibidos a través de la interfaz del APNS de FCM probablemente abarca la mayoría de los casos prácticos típicos. Para los casos prácticos especiales que exijan una confiabilidad muy alta, puedes controlar los mensajes del canal directo de FCM en tu aplicación. También puedes enviar mensajes ascendentes.

Administra los mensajes recibidos a través de la interfaz del APNS de FCM

Cuando tu app se encuentra en segundo plano, iOS dirige los mensajes que incluyen la clave notification a la bandeja del sistema. Cuando el usuario presiona una notificación, se abre la app y el contenido de la notificación se pasa a la devolución de llamada didReceiveRemoteNotification en el AppDelegate.

Implementa AppDelegate application:didReceiveRemoteNotification:, como se muestra a continuación:

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

Si quieres abrir la app y realizar una acción específica, configura click_action en la carga útil de la notificación. Usa el valor que emplearías normalmente para la clave category en la carga útil del APNS.

Interpretación de la carga útil del mensaje de notificación

La carga útil de los mensajes de notificación es un diccionario de claves y valores. Los mensajes de notificación enviados a través del APNS usan el formato de carga útil del APNS que se muestra a continuación:

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

Controla los mensajes con la referencia de métodos inhabilitada

Si inhabilitas la referencia de métodos, deberás invocar un método para que FCM realice el seguimiento de la entrega de mensajes y de sus estadísticas. Se hace automáticamente cuando la referencia de métodos está habilitada.

En iOS 10 y las versiones posteriores, puedes configurar la propiedad delegate de UNUserNotificationCenter para recibir notificaciones en pantalla de Apple y la propiedad delegate de FIRMessaging a fin de recibir mensajes de datos de FCM. Si no configuras estos dos delegados con AppDelegate, se inhabilita la referencia de métodos para el manejo de mensajes. Deberás llamar al método appDidReceiveMessage: para realizar un seguimiento de la entrega de mensajes y sus estadísticas.

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 y versiones 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 y versiones 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
   }
 

Controla los mensajes del canal directo de FCM

Si quieres recibir mensajes silenciosos que solo contengan datos directamente desde FCM y pasar por alto APNS cuando la app esté en primer plano, deberás conectarte al servicio de FCM y controlar los mensajes con el método messaging:didReceiveMessage: de FIRMessagingDelegate. Cuando el canal directo está habilitado, el backend de FCM usa una cola de mensajes confiable para hacer un seguimiento de los mensajes pendientes cuando la app está en segundo plano o cerrada. Cuando la app pasa al primer plano y se restablece la conexión, el canal enviará de manera automática los mensajes pendientes al cliente hasta que este envíe una confirmación.

Para conectarte, asigna a shouldEstablishDirectChannel el valor YES en AppDelegate. FCM administra la conexión, la cierra cuando la app pasa a segundo plano y vuelve a abrirla cuando está en primer plano.

Además, configura la marca useMessagingDelegateForDirectChannel en YES en el AppDelegate y, luego, implementa messaging:didReceiveMessage:. Tu app seguirá recibiendo los mensajes de APNS aunque no implementes esta devolución de llamada, pero es necesaria para los mensajes directos de FCM.

Interpretación de la carga útil del mensaje de datos

La carga útil de los mensajes de datos es un diccionario de claves y valores. Los mensajes de datos enviados a los dispositivos directamente por el servidor de FCM se expresan en el formato de un diccionario, como se muestra a continuación:

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

Administración de mensajes borrados o en cola

Las apps que se conecten a FCM para recibir mensajes de datos deben administrar FIRMessagingMessagesDeletedNotification. Es posible que recibas esta devolución de llamada si hay muchos mensajes (más de 100) pendientes para tu app en un dispositivo específico al momento de conectarse o si el dispositivo no se ha conectado a FCM en más de un mes. Cuando la instancia de la app reciba esta devolución de llamada, debería ejecutar una sincronización completa con tu servidor de apps.

Para obtener estadísticas de la entrega de mensajes a tu app, consulta el panel de informes de FCM que registra la cantidad de mensajes enviados y abiertos en dispositivos iOS y Android, junto con datos de “impresiones” (notificaciones vistas por los usuarios) para apps de Android.

Enviar comentarios sobre…

¿Necesitas ayuda? Visita nuestra página de asistencia.