Wysyłanie wiadomości upstream na Androidzie

Jeśli serwer aplikacji implementuje protokół serwera połączeń XMPP , może odbierać wiadomości nadrzędne z urządzenia użytkownika do chmury. Aby zainicjować wiadomość nadrzędną, aplikacja kliencka wysyła żądanie zawierające następujące informacje:

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

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

Wyślij wiadomość nadrzędną z aplikacji klienckiej na Androida

Twoja aplikacja na Androida może wysyłać wiadomości nadrzędne za pomocą 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ługuj wywołania zwrotne wiadomości nadrzędnych

Dzięki FirebaseMessaging możesz zaimplementować wywołania zwrotne onMessageSent i onSendError , aby sprawdzić status wiadomości nadrzędnych. W przypadku błędów onSendError zwraca SendException z kodem błędu. Na przykład, jeśli klient spróbuje wysłać więcej wiadomości po osiągnięciu limitu 20 wiadomości, zwróci SendException#ERROR_TOO_MANY_MESSAGES .

W przypadku, gdy urządzenie jest w trybie offline lub usługa FCM nie jest dostępna do przekazywania wiadomości nadrzędnych na serwer, instancje aplikacji klienckiej dla systemu Android mogą gromadzić maksymalnie 20 oczekujących wiadomości. Jeśli takie komunikaty wygasną, zanim FCM będzie mógł je pomyślnie wysłać, onSendError zwraca SendException#ERROR_TTL_EXCEEDED .

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

Odbieraj wiadomości XMPP na serwerze aplikacji

Gdy FCM odbierze połączenie nadrzędne z aplikacji klienckiej, generuje niezbędną sekcję XMPP do wysłania komunikatu nadrzędnego. FCM dodaje pola category i from , a następnie wysyła do serwera aplikacji następującą sekcję:

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

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

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

Więcej informacji na temat składni komunikatów nadrzędnych można znaleźć w dokumentacji serwera połączeń XMPP .