Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

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

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

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

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

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

Android アプリは、FirebaseMessaging.send を使用してアップストリーム メッセージを送信できます。

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());

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")
})

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

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 接続サーバー リファレンスをご覧ください。