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

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

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

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

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

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

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

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

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

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

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

Instance 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

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

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

トピック HTTP レスポンス

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

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

トピック XMPP メッセージ

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

<message id="">
  <gcm xmlns="google:mobile:data">

  </gcm>
</message>

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

<message id="">
  <gcm xmlns="google:mobile:data">

  </gcm>
</message>

トピック XMPP レスポンス

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

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

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

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

次のステップ

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

ご不明な点がありましたら、Google のサポートページをご覧ください。