Google 致力于为黑人社区推动种族平等。查看具体举措
Эта страница переведена с помощью Cloud Translation API.
Switch to English

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

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

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

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

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

Ваше приложение Android может отправлять восходящее сообщение с помощью FirebaseMessaging.send :

Ява

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());

Котлин + 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")
})

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

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

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

Чтобы оптимизировать использование сети, FCM onMessageSent ответы на 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 .