Если ваш сервер приложений реализует протокол сервера соединений 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 .