Wysyłanie wiadomości nadrzędnych w Androidzie

.

Jeśli serwer aplikacji implementuje protokół XMPP Connection Server, może odbierać wiadomości z urządzenia użytkownika do chmury. Aby zainicjować wiadomość w górę, aplikacja klienta wysyła żądanie zawierające:

  • Adres serwera aplikacji odbierającej w formacie SENDER_ID@fcm.googleapis.com.
  • Identyfikator wiadomości, który powinien być niepowtarzalny dla każdego identyfikatora nadawcy.
  • Dane wiadomości, które stanowią pary klucz-wartość ładunku wiadomości.

Po otrzymaniu tych danych FCM tworzy zwrotkę XMPP, którą wysyła do serwera aplikacji, dodając dodatkowe informacje o wysyłającym urządzeniu i aplikacji.

Wysyłanie wiadomości w dół z aplikacji klienckiej na Androida

Aplikacja na Androida może wysyłać wiadomości w dół łańcucha za pomocą metody 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());

Obsługa wywołań zwrotnych wiadomości z wyższego poziomu

Dzięki FirebaseMessaging możesz zaimplementować wywołania zwrotne onMessageSent i onSendError, aby sprawdzić stan wiadomości docierających z wyższego poziomu. W przypadku wystąpienia błędu funkcja onSendError zwraca wartość SendExceptionz kodem błędu. Jeśli na przykład klient spróbuje wysłać więcej wiadomości po osiągnięciu limitu 20 wiadomości, otrzyma odpowiedź SendException#ERROR_TOO_MANY_MESSAGES.

Jeśli urządzenie jest offline lub usługa FCMjest niedostępna do przekazywania wiadomości do serwera, instancje aplikacji klienckiej na Androidzie mogą gromadzić maksymalnie 20 oczekujących wiadomości. Jeśli takie wiadomości wygasną, zanim FCM zdąży je wysłać, funkcja onSendError zwróci wartość SendException#ERROR_TTL_EXCEEDED.

Aby zoptymalizować wykorzystanie sieci, FCM wysyła odpowiedzi zbiorczo do onMessageSent i onSendError, więc potwierdzenie może nie być natychmiastowe w przypadku każdej wiadomości.

Odbieranie komunikatów XMPP na serwerze aplikacji

Gdy FCM otrzyma wywołanie przesyłania wiadomości od aplikacji klienta, wygeneruje niezbędną zwrotkę XMPP do wysłania wiadomości upstream. FCM dodaje pola categoryfrom, a następnie wysyła do serwera aplikacji zwrotkę podobną do tej:

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

Wysyłanie wiadomości potwierdzenia

W odpowiedzi na wiadomość nadrzędną, taką jak powyżej, serwer aplikacji musi użyć tego samego połączenia do wysłania wiadomości ACK zawierającej unikalny identyfikator wiadomości. Jeśli FCM nie otrzyma potwierdzenia, może ponownie wysłać wiadomość do serwera aplikacji.

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

Więcej informacji o składni wiadomości z wyższego poziomu znajdziesz w dokumentacji XMPP Connection Server Reference.