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ć niepowtarzalny dla każdego identyfikatora nadawcy.
  • Dane wiadomości zawierające 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 nadrzędnej

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 FCMnie jest dostępna do przekierowywania 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ędny zwrot XMPP do wysłania wiadomości upstream. 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ż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 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 o składni wiadomości z wyższego poziomu znajdziesz w dokumentacji XMPP Connection Server Reference.