Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

Enviando mensagens upstream no Android

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

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 de aplicativos de recebimento 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 chave-valor da carga útil da mensagem.

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

Enviar uma mensagem upstream de um aplicativo cliente Android

Seu aplicativo Android pode enviar uma mensagem upstream usando 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+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")
})

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 um SendException com um código de erro. Por exemplo, se o cliente tentar enviar mais mensagens depois que o limite de 20 mensagens for 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 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 sucesso, onSendError retornará SendException#ERROR_TTL_EXCEEDED .

Para otimizar o uso da rede, o FCM agrupa as 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 mensagem 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 para o servidor de aplicativos.

<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 de mensagem upstream.