Como enviar mensagens upstream no Android

Se o servidor do app implementar o protocolo do servidor de conexão XMPP, ele poderá enviar mensagens upstream do dispositivo do usuário para a nuvem. Para iniciar uma mensagem upstream, o aplicativo cliente envia uma solicitação contendo:

  • o endereço do servidor do aplicativo de destino no formato SENDER_ID@fcm.googleapis.com;
  • um código da mensagem que deve ser exclusivo para cada código do remetente;
  • os dados da mensagem, inclusive os pares de chave-valor do payload da mensagem.

Ao receber esses dados, o FCM desenvolve uma estrofe XMPP para enviar ao servidor do app, acrescentando algumas informações adicionais sobre o aplicativo e o dispositivo emissor.

Enviar uma mensagem upstream de um app cliente Android

Seu app Android pode enviar uma mensagem upstream utilizando FirebaseMessaging.send:

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

Kotlin

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

Processar retornos de chamada de mensagens upstream

Com o FirebaseMessaging, você pode implementar os retornos de chamada onMessageSent e onSendError para verificar o status das mensagens upstream. Em casos de erro, onSendError retorna um SendException com um código de erro. Por exemplo, se o cliente tentar enviar mais mensagens após exceder o limite de 20 mensagens, a mensagem SendException#ERROR_TOO_MANY_MESSAGES será retornada.

Quando o dispositivo estiver off-line ou o serviço do FCM não estiver disponível para encaminhar mensagens upstream para o servidor, as instâncias de apps cliente Android poderão acumular no máximo 20 mensagens pendentes. Se essas mensagens expirarem antes que o FCM possa enviá-las com sucesso, o onSendError retornará SendException#ERROR_TTL_EXCEEDED.

Para otimizar o uso da rede, o FCM lança respostas para onMessageSent e onSendError, portanto, a confirmação pode não ser imediata para cada mensagem.

Receber mensagens XMPP no servidor de aplicativos

Quando uma chamada de mensagem upstream de um app cliente é recebida no FCM, é gerada uma estrofe XMPP para enviar essa mensagem. Os campos category e from são adicionados pelo FCM, que envia uma estrofe como esta ao servidor do aplicativo:

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

Envio de mensagens ACK

Para responder a uma mensagem upstream como a mostrada acima, o servidor do aplicativo precisa usar a mesma conexão para enviar uma mensagem ACK com o código exclusivo da mensagem. Se o FCM não receber uma ACK, ele tentará enviar novamente a mensagem ao servidor do aplicativo.

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

Consulte Referência do servidor de conexão XMPP para mais informações sobre a sintaxe de mensagens upstream.