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.