Wysyłanie wiadomości nadrzędnych w Androidzie

Jeśli serwer aplikacji korzysta z protokołu serwera połączenia XMPP, może odbierać komunikaty z urządzenia użytkownika do chmury. Aby zainicjować wiadomość nadrzędną, aplikacja kliencka wysyła żądanie zawierające te elementy:

  • 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 wiadomości zawierające pary klucz-wartość ładunku wiadomości.

Po otrzymaniu tych danych FCM tworzy układ XMPP, który wysyła się do serwera aplikacji, i dodaje dodatkowe informacje o urządzeniu i aplikacji wysyłającej.

Wysyłanie wiadomości z aplikacji klienckiej na Androida

Aplikacja na Androida może wysłać wiadomość nadrzędną 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ługa wywołań zwrotnych wiadomości nadrzędnej

Za pomocą FirebaseMessaging możesz zaimplementować wywołania zwrotne onMessageSent i onSendError, aby sprawdzić stan komunikatów nadrzędnych. W przypadku błędów onSendError zwraca SendException z 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, zwraca wartość SendException#ERROR_TOO_MANY_MESSAGES.

Gdy urządzenie jest offline lub usługa FCM jest niedostępna, aby przekazać wiadomości nadrzędne na Twój serwer, instancje klienckiej aplikacji na Androida mogą zebrać maksymalnie 20 oczekujących wiadomości. Jeśli takie wiadomości wygasną, zanim FCM je wyśle, onSendError zwraca SendException#ERROR_TTL_EXCEEDED.

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

Odbieraj komunikaty XMPP na serwerze aplikacji

Gdy FCM odbiera z aplikacji klienckiej żądanie przesyłania wiadomości z aplikacji klienckiej, generuje niezbędną strofę XMPP do wysłania wiadomości nadrzędnej. FCM dodaje pola category i from, a następnie wysyła do serwera aplikacji ciąg znaków podobny do tego:

<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łam wiadomość z potwierdzeniem

W odpowiedzi na wiadomość nadrzędną, taką jak powyżej, serwer aplikacji musi używać tego samego połączenia, aby wysłać wiadomość potwierdzenia zawierającą unikalny identyfikator wiadomości. Jeśli FCM nie otrzyma potwierdzenia, może ponowić próbę wysłania wiadomości na serwer 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 wysyłanych do serwera znajdziesz w dokumentacji serwera połączenia XMPP.