Google 致力于为黑人社区推动种族平等。查看具体举措

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

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

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

Получив эти данные, 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 и 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 для получения дополнительной информации о входе синтаксиса сообщений.