Отправка восходящих сообщений на 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 .