Enviar mensajes ascendentes en Android

Si su servidor de aplicaciones implementa el protocolo del servidor de conexión XMPP , puede recibir mensajes ascendentes desde el dispositivo de un usuario a la nube. Para iniciar un mensaje ascendente, la aplicación cliente envía una solicitud que contiene lo siguiente:

  • La dirección del servidor de la aplicación receptor en el formato SENDER_ID@fcm.googleapis.com .
  • Un ID de mensaje que debe ser único para cada ID de remitente .
  • Los datos del mensaje que comprenden los pares clave-valor de la carga útil del mensaje.

Cuando recibe estos datos, FCM crea una estrofa XMPP para enviarla al servidor de aplicaciones, agregando información adicional sobre el dispositivo y la aplicación de envío.

Enviar un mensaje ascendente desde una aplicación cliente de Android

Tu aplicación de Android puede enviar un mensaje ascendente usando FirebaseMessaging.send :

Kotlin+KTX

val fm = Firebase.messaging
fm.send(
    remoteMessage("$SENDER_ID@fcm.googleapis.com") {
        setMessageId(messageId.toString())
        addData("my_message", "Hello World")
        addData("my_action", "SAY_HELLO")
    },
)

Java

FirebaseMessaging fm = FirebaseMessaging.getInstance();
fm.send(new RemoteMessage.Builder(SENDER_ID + "@fcm.googleapis.com")
        .setMessageId(Integer.toString(messageId))
        .addData("my_message", "Hello World")
        .addData("my_action","SAY_HELLO")
        .build());

Manejar devoluciones de llamadas de mensajes ascendentes

Con FirebaseMessaging , puedes implementar las devoluciones de llamada onMessageSent y onSendError para verificar el estado de los mensajes ascendentes. En casos de error, onSendError devuelve una SendException con un código de error. Por ejemplo, si el cliente intenta enviar más mensajes después de alcanzar el límite de 20 mensajes, devuelve SendException#ERROR_TOO_MANY_MESSAGES .

En los casos en que el dispositivo esté fuera de línea o el servicio FCM no esté disponible para reenviar mensajes ascendentes a su servidor, las instancias de la aplicación cliente de Android pueden acumular un máximo de 20 mensajes pendientes. Si dichos mensajes caducan antes de que FCM pueda enviarlos correctamente, onSendError devuelve SendException#ERROR_TTL_EXCEEDED .

Para optimizar el uso de la red, FCM procesa por lotes las respuestas a onMessageSent y onSendError , por lo que es posible que el reconocimiento no sea inmediato para cada mensaje.

Reciba mensajes XMPP en el servidor de aplicaciones

Cuando FCM recibe una llamada de mensajería ascendente desde una aplicación cliente, genera la estrofa XMPP necesaria para enviar el mensaje ascendente. FCM agrega los campos category y from , y luego envía una estrofa como la siguiente al servidor de aplicaciones:

<message id="">
  <gcm xmlns="google:mobile:data">
  {
      "category":"com.example.yourapp", // to know which app sent it
      "data":
      {
          "hello":"world",
      },
      "message_id":"m-123",
      "from":"REGID"
  }
  </gcm>
</message>

Enviar un mensaje ACK

En respuesta a un mensaje ascendente como el anterior, el servidor de la aplicación debe usar la misma conexión para enviar un mensaje ACK que contenga el ID único del mensaje. Si FCM no recibe un ACK, puede volver a intentar enviar el mensaje al servidor de aplicaciones.

<message id="">
  <gcm xmlns="google:mobile:data">
  {
      "to":"REGID",
      "message_id":"m-123"
      "message_type":"ack"
  }
  </gcm>
</message>

Consulte la Referencia del servidor de conexión XMPP para obtener más información sobre la sintaxis de mensajes ascendentes.