Android でのアップストリーム メッセージの送信

XMPP 接続サーバー プロトコルを実装しているアプリサーバーは、ユーザー デバイスからクラウドへのアップストリーム メッセージを受信できます。アップストリーム メッセージを開始するには、クライアント アプリから次の要素を含むリクエストを送信します。

  • 受信側アプリサーバーのアドレス(SENDER_ID@fcm.googleapis.com の形式)。
  • 送信者 ID ごとに一意なメッセージ ID。
  • メッセージのペイロードの Key-Value ペアを構成するメッセージ データ。

このデータを受信すると、FCM は送信側のデバイスとアプリに関するその他の情報を追加して、アプリサーバーに送信する XMPP スタンザを生成します。

Android クライアント アプリからアップストリーム メッセージを送信する

Android アプリは、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());

アップストリーム メッセージ コールバックを処理する

FirebaseMessaging では、コールバック onMessageSentonSendError を実装して、アップストリーム メッセージのステータスを確認できます。エラーの場合、onSendError はエラーコードとともに SendException を返します。たとえば、メッセージ数の上限である 20 件に達した後で、クライアントがさらにメッセージを送信しようとすると、SendException#ERROR_TOO_MANY_MESSAGES が返されます。

デバイスがオフライン状態のときや、アップストリーム メッセージをアプリサーバーに転送するために FCM サービスを使用できない場合、Android クライアント アプリのインスタンスは、最大 20 件まで保留メッセージを蓄積します。 蓄積したメッセージを FCM が受け取って送信する前にそれらの有効期限が切れた場合、onSendErrorSendException#ERROR_TTL_EXCEEDED を返します。

ネットワークの使用率を最適化するために、FCM は onMessageSentonSendError へのレスポンスを一括処理します。これにより、各メッセージの確認応答が即時に行われないことがあります。

アプリサーバーで 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 メッセージを送信する

上記のようなアップストリーム メッセージへのレスポンスとして、アプリサーバーは同じ接続を使用して、一意のメッセージ ID を含む ACK メッセージを送信する必要があります。ACK を受信しないと、FCM はアプリサーバーへのメッセージの送信を再試行することがあります。

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

アップストリーム メッセージの構文の詳細については、XMPP 接続サーバー リファレンスをご覧ください。