C++ でのトピック メッセージング

パブリッシュ / サブスクライブ モデルに基づく FCM トピック メッセージングでは、特定のトピックにオプトインした複数の端末にメッセージを送信できます。必要に応じてトピック メッセージを作成すると、FCM は信頼できる方法でメッセージをルーティングし、正しい端末に配信します。

たとえば、地域の天気予報アプリのユーザーは、気象警報のトピックにオプトインし、指定した地域に影響を与える暴風雨警報の通知を受信できます。スポーツアプリのユーザーは、お気に入りのチームの実況ゲームスコアの自動更新に登録できます。

トピックに関する留意点を以下に示します。

  • トピック メッセージングでは、アプリごとに無制限のトピックとサブスクリプションがサポートされます。
  • トピック メッセージングは、ニュース、天気、その他の広く入手可能な情報コンテンツに最適です。
  • トピック メッセージは、待ち時間ではなく、スループットに関して最適化されます。単一の端末または小規模な端末グループに高速で安全な配信を行うには、トピックではなく、トークンをメッセージの対象にしてください
  • メッセージをユーザーごとに複数の端末に送信する必要がある場合は、そのようなユースケース向けの端末グループ メッセージングを検討してください。

クライアント アプリをトピックに登録する

トピックに登録するには、アプリケーションから ::firebase::messaging::Subscribe を呼び出します。これにより、FCM バックエンドへの非同期リクエストが作成され、所定のトピックにクライアントが登録されます。

::firebase::messaging::Subscribe("/topics/example");

最初の登録リクエストが失敗した場合、FCM はトピックに正しく登録できるまで試行を繰り返します。アプリが開始するごとに、FCM は、リクエストされたすべてのトピックが登録済みであるか確認します。

登録解除するには、::firebase::messaging::Unsubscribe を呼び出します。これにより、FCM はバックグラウンドでトピックからの登録解除を行います。

サーバーでトピック登録を管理する

インスタンス ID API を利用して、サーバー側から基本的なトピック管理タスクを行うことができます。クライアント アプリ インスタンスの登録トークンを取得すると、次の操作を行えます。

メッセージを受信して処理する

FCM は、他のダウンストリーム メッセージと同じようにトピック メッセージを配信します。

::firebase::messaging::Listener::OnMessage メソッドをオーバーライドすると、受信メッセージに基づいて操作を実行し、メッセージ データを取得することができます。

void OnMessage(const ::firebase::messaging::Message& message) {
  LogMessage(TAG, "From: %s", message.from.c_str());
  LogMessage(TAG, "Message ID: %s", message.message_id.c_str());
}

ビルド送信リクエスト

サーバー側からの Firebase Cloud Messaging トピックへのメッセージの送信は、個々の端末やユーザー グループ宛てのメッセージの送信とよく似ています。アプリサーバーは to キーに /topics/yourTopic などの値を設定します。デベロッパーは、次の正規表現に一致する任意のトピック名を選択できます。 "/topics/[a-zA-Z0-9-_.~%]+"

複数のトピックの組み合わせに送信する場合、アプリサーバーは condition キーに、対象のトピックを指定するブール条件を設定します。たとえば、TopicA と、TopicBTopicC のいずれかに登録された端末にメッセージを送信する場合は、次のようになります。

'TopicA' in topics && ('TopicB' in topics || 'TopicC' in topics)

FCM はまず、かっこ内の条件を評価し、次に左から右に式を評価していきます。上記の式では、いずれか 1 つのトピックだけに登録したユーザーはメッセージを受信しません。同様に、TopicA に登録していないユーザーはメッセージを受信しません。メッセージを受信するのは、次の組み合わせの場合のみです。

  • TopicA と TopicB
  • TopicA と TopicC

トピックの条件では、かっこの使用と、式ごとに 2 つの演算子の使用がサポートされています。

アプリサーバーのキーの詳細については、選択した接続サーバー プロトコル(HTTP または XMPP)の参照情報をご覧ください。このページの例では、HTTP と XMPP でデータ メッセージをトピックに送信する方法を示しています。

HTTP POST リクエスト

単一のトピックに送信します。

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{
  "to": "/topics/foo-bar",
  "data": {
    "message": "This is a Firebase Cloud Messaging Topic Message!",
   }
}

「犬」や「猫」のトピックに登録された端末に送信します。

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{
  "condition": "'dogs' in topics || 'cats' in topics",
  "data": {
    "message": "This is a Firebase Cloud Messaging Topic Message!",
   }
}

HTTP レスポンス

//Success example:
{
  "message_id": "1023456"
}

//failure example:
{
  "error": "TopicsMessageRateExceeded"
}

XMPP メッセージ

単一のトピックに送信します。

<message id="">
  <gcm xmlns="google:mobile:data">
  {
      "to": "/topics/foo-bar",
      "message_id": "m-1366082849205" ,
      "data": {
          "message":"This is a Firebase Cloud Messaging Topic Message!"
      }
  }
  </gcm>
</message>

「犬」や「猫」のトピックに登録された端末に送信します。

<message id="">
  <gcm xmlns="google:mobile:data">
  {
    "condition": "'dogs' in topics || 'cats' in topics",
    "data": {
      "message": "This is a Firebase Cloud Messaging Topic Message!",
     }
  }
  </gcm>
</message>

XMPP レスポンス

//Success example:
{
  "message_id": "1023456"
}

//failure example:
{
  "error": "TopicsMessageRateExceeded"
}

FCM 接続サーバーが、トピック送信リクエストに成功または失敗のレスポンスを返すまでに、最大 30 秒の遅延が発生する可能性があります。それに応じて、リクエスト内でアプリサーバーのタイムアウト値を必ず設定してください。

メッセージ オプションの完全なリストについては、選択した接続サーバー プロトコル(HTTP または XMPP)の参照情報をご覧ください。

次のステップ

フィードバックを送信...