Отправка восходящих сообщений на Android

Если ваш сервер приложений реализует протокол сервера соединений XMPP , он может получать восходящие сообщения с устройства пользователя в облако. Чтобы инициировать восходящее сообщение, клиентское приложение отправляет запрос, содержащий следующее:

  • Адрес принимающего сервера приложений в формате SENDER_ID@fcm.googleapis.com .
  • Идентификатор сообщения, который должен быть уникальным для каждого идентификатора отправителя .
  • Данные сообщения, содержащие пары ключ-значение полезной нагрузки сообщения.

Когда он получает эти данные, FCM создает раздел XMPP для отправки на сервер приложений, добавляя дополнительную информацию об отправляющем устройстве и приложении.

Отправка восходящего сообщения из клиентского приложения Android

Ваше Android-приложение может отправлять восходящие сообщения с помощью 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());

Обработка обратных вызовов восходящих сообщений

С помощью FirebaseMessaging вы можете реализовать обратные вызовы onMessageSent и onSendError для проверки статуса восходящих сообщений. В случае ошибки onSendError возвращает SendException с кодом ошибки. Например, если клиент пытается отправить больше сообщений после достижения лимита в 20 сообщений, он возвращает SendException#ERROR_TOO_MANY_MESSAGES .

В случаях, когда устройство находится в автономном режиме или служба FCM недоступна для пересылки восходящих сообщений на ваш сервер, экземпляры клиентского приложения Android могут накапливать максимум 20 ожидающих сообщений. Если срок действия таких сообщений истекает до того, как FCM сможет их успешно отправить, onSendError возвращает SendException#ERROR_TTL_EXCEEDED .

Чтобы оптимизировать использование сети, FCM группирует ответы на onMessageSent и onSendError , поэтому подтверждение для каждого сообщения может не быть немедленным.

Получать сообщения XMPP на сервере приложений.

Когда FCM получает восходящий вызов обмена сообщениями от клиентского приложения, он генерирует необходимый раздел XMPP для отправки восходящего сообщения. FCM добавляет поля category и from , а затем отправляет на сервер приложений следующий раздел:

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

Отправка сообщения ACK

В ответ на сообщение восходящего потока, подобное приведенному выше, сервер приложений должен использовать то же соединение для отправки сообщения ACK, содержащего уникальный идентификатор сообщения. Если FCM не получает ACK, он может повторить попытку отправки сообщения на сервер приложений.

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

Дополнительную информацию о синтаксисе восходящих сообщений см. в справочнике по серверу соединений XMPP.