Ir para o console

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 essa mensagem, o app cliente envia uma solicitação contendo:

  • o endereço do servidor de apps 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 de app, acrescentando algumas informações adicionais sobre o app 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
Android

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
Android

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 callbacks de mensagens upstream

Com FirebaseMessaging, você pode implementar os retornos de chamada onMessageSent e onSendError para verificar o status das mensagens upstream. Em caso de falha, onSendError retorna um SendException com um código do 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 retornará.

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 consiga enviá-las com sucesso, o onSendError retornará SendException#ERROR_TTL_EXCEEDED.

Para otimizar o uso da rede, o FCM armazena respostas em lotes para onMessageSent e onSendError, por isso o reconhecimento pode não ser imediato para cada mensagem.

Receber mensagens XMPP no servidor do app

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

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

Como enviar mensagens ACK

No servidor do app, para responder a uma mensagem upstream como a mostrada acima, é necessário usar a mesma conexão para enviar uma ACK com o código exclusivo da mensagem. Se uma ACK não for recebida no FCM, ela será reenviada para o servidor do app.

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

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