Enviando mensagens upstream no Android

Se o seu servidor de aplicativos implementar o protocolo XMPP Connection Server , ele poderá receber mensagens upstream do dispositivo de um usuário para a nuvem. Para iniciar uma mensagem upstream, o aplicativo cliente envia uma solicitação contendo o seguinte:

  • O endereço do servidor do aplicativo receptor no formato SENDER_ID@fcm.googleapis.com .
  • Um ID de mensagem que deve ser exclusivo para cada ID de remetente .
  • Os dados da mensagem que compreendem os pares de valores-chave da carga útil da mensagem.

Ao receber esses dados, o FCM cria uma estrofe XMPP para enviar ao servidor do aplicativo, adicionando algumas informações adicionais sobre o dispositivo e o aplicativo remetente.

Envie uma mensagem upstream de um aplicativo cliente Android

Seu aplicativo Android pode enviar uma mensagem upstream 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());

Lidar com retornos de chamada de mensagens upstream

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

Nos casos em que o dispositivo está off-line ou o serviço FCM não está disponível para encaminhar mensagens upstream para o seu servidor, as instâncias do aplicativo cliente Android podem acumular no máximo 20 mensagens pendentes. Se essas mensagens expirarem antes que o FCM possa enviá-las com êxito, onSendError retornará SendException#ERROR_TTL_EXCEEDED .

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

Receba mensagens XMPP no servidor de aplicativos

Quando o FCM recebe uma chamada de mensagens upstream de um aplicativo cliente, ele gera a estrofe XMPP necessária para enviar a mensagem upstream. O FCM adiciona os campos category e from e, em seguida, envia uma estrofe como a seguinte para o servidor de aplicativos:

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

Enviando uma mensagem ACK

Em resposta a uma mensagem upstream como a acima, o servidor de aplicativos deve usar a mesma conexão para enviar uma mensagem ACK contendo o ID exclusivo da mensagem. Se o FCM não receber um ACK, ele poderá 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 a Referência do Servidor de Conexão XMPP para obter mais informações sobre a sintaxe da mensagem upstream.