1. はじめに
目標
この Codelab では、マルチプラットフォーム アプリをインストルメント化して、FCM トピックを使用してアプリ インスタンスのさまざまなサブグループに push メッセージをマルチキャストできるようにする方法を学びます。
完了すると、FCM インフラストラクチャを利用して、これらのサブグループを管理したり、サブグループに対する push メッセージをマルチキャストしたりできるようになります。
トピックの概要
トピックは、FCM インフラストラクチャでサポートされている方法で、アプリ インスタンスのサブグループにメッセージでアクセスします。
FCM には、メッセージの送信と、これらのトピックへのサブスクリプションの維持を行うための API が用意されています。アプリ インスタンスをトピックに関連付ける行為と分離する行為をそれぞれサブスクライブとサブスクライブ解除と呼びます。
トピックは、一般公開されているコンテンツに使用する必要があります。たとえば、最新の天気情報に関するメッセージなどです。ユーザー機密のメッセージを送信する場合は、Firebase Admin SDK を使用して複数のデバイス間でメッセージをマルチキャストします。
トピックベースのマルチキャストは、スループットに合わせて最適化されています。
ラボの内容
- モバイルアプリからトピックにユーザーを登録(および登録解除)する方法。
- トピックを使用してマルチキャスト プッシュ メッセージを送信する方法。
- トピック条件を使用してトピックの組み合わせにメッセージを送信する方法。
- サーバーサイドでトピックのサブスクリプションを管理し、一括でサブスクリプションと登録解除を行う方法。
作成するアプリの概要
- トピックのサブスクライブ/サブスクライブ解除を行い、トピックに送信されるとメッセージを受信する Android アプリ。
- Firebase Admin SDK を使用したサーバーサイドの統合。FCM API を介してトピック メッセージを送信するために使用されます。
必要なもの
- Chrome などの任意のブラウザ。
- Java アプリケーションを開発するための IntelliJ IDEA IDE。
- インストール時に、Gradle のサポートを必ず有効にしてください。
- Android アプリを開発するための Android Studio IDE。
- Android アプリを実行するデバイス。次のいずれかです。
- Android Emulator(Android Studio でのセットアップが必要です)。
- パソコンに接続され、デベロッパー モードに設定された物理 Android デバイス。
- Firebase プロジェクトを作成、管理するための Google アカウント。
2. 設定方法
コードを取得する
コマンドラインから GitHub リポジトリのクローンを作成します。
git clone https://github.com/firebase/quickstart-android.git fcm-codelab
サンプルコードのクローンが fcm-codelab
ディレクトリに作成されます。
cd fcm-codelab
この Codelab のスターター アプリは、fcm-topics-codelab
ブランチの messaging
ディレクトリにあります。次の手順でスターター コードに到達します。StockNewsApp
と StockNewsServer
の 2 つのディレクトリがあります。前者にはスターター Android アプリが含まれ、後者にはスターター サーバー側のコードが含まれます。
git checkout fcm-topics-codelab cd messaging/fcm-topics-codelab/starter
この Codelab の完成版は messaging/fcm-topics-codelab/completed
ディレクトリにあります。
Firebase プロジェクトを作成する
- Firebase コンソールで [プロジェクトを追加] をクリックし、Firebase プロジェクトに「StockNews」という名前を付けて [続行] をクリックします。注: Firebase プロジェクトのプロジェクト ID を覚えておいてください(または、編集アイコンをクリックして目的のプロジェクト ID を設定します)。
- Google アナリティクスの有効化はスキップできます。この Codelab の目的上、これは必要ありません。[続行] をクリックします。
- [プロジェクトの作成] をクリックします。
これで完了です。これで Firebase プロジェクトが作成されました。これで、プロジェクト名をクリックしてコンソールに移動できます。
3. プラットフォーム固有の Firebase アプリの構成
Firebase サポートを有効にするために必要なコード変更のほとんどは、作業中のプロジェクトにすでにチェックインされています。ただし、モバイル プラットフォームのサポートを追加するには、次の操作を行う必要があります。
- Firebase プロジェクトに目的のプラットフォームを登録する
- プラットフォーム固有の構成ファイルをダウンロードして、コードに追加します。
この Codelab では、Android Firebase アプリを追加します。
Android の設定
- Firebase コンソールで、左側のナビゲーション バーの上部にある [設定] の歯車から [プロジェクトの設定] を選択し、[全般] ページの [マイアプリ] の下にある [Android] アイコンをクリックします。
次のようなダイアログが表示されます。
- 指定すべき重要な値は Android パッケージ名です。
com.ticker.stocknews
に設定します。- ここで指定するパッケージ名は、スターター StockNewsApp コードの
AndroidManifest.xml
内で指定する名前と同じにする必要があります。デバイスを特定または変更する場合は、次の手順を行ってください。- StockNewsApp ディレクトリでファイル
app/src/main/AndroidManifest.xml
を開きます。 manifest
要素で、package
属性の文字列値を探します。この値は Android パッケージ名です。
- StockNewsApp ディレクトリでファイル
- ここで指定するパッケージ名は、スターター StockNewsApp コードの
- Firebase ダイアログで、コピーしたパッケージ名を [Android パッケージ名] フィールドに貼り付けます。
- このアプリはリリースされないため、この Codelab ではデバッグ用の署名証明書 SHA-1 は必要ありません。空欄のままにしておきます。
- [アプリを登録] をクリックします。
- 引き続き Firebase コンソールで、手順に沿って構成ファイル
google-services.json
をダウンロードします。 - 残りのセットアップ手順はスターター アプリのコードですでに構成されているため、スキップできます。Firebase コンソールのメインページにアプリが表示されます。
- ダウンロードした
google-services.json
ファイルをmessaging/fcm-topics-codelab/starter/StockNewsApp/app
ディレクトリにコピーします。
4. アプリをビルドして実行する
アプリの作業を実際に開始する準備が整いました。まず、アプリをビルドして実行します。
スターター アプリをインポートする
Android Studio を起動し、スターター コードのディレクトリから messaging/fcm-topics-codelab/starter/StockNewsApp
をインポートします。
プロジェクトが読み込まれた後、ローカルで Git がトラッキングしていないというアラートが表示される場合があります。その場合は、右上の [Ignore] または [X] をクリックします。(変更を Git リポジトリにプッシュバックすることはありません)。
[Android] ビューの場合は、プロジェクト ウィンドウの左上に次のような画像が表示されます。([Project] ビューが表示されている場合、同じ内容を表示するにはプロジェクトを展開する必要があります)。
Android Studio で初めてバックグラウンドでプロジェクトをコンパイルする場合、数秒かかる場合があります。その間、Android Studio の下部にあるステータスバーにスピナーが表示されます。
この作業が終了するまで待ってから、コードを変更することをおすすめします。これにより、Android Studio に必要なコンポーネントをすべて取り込むことができます。
また、「Retail for language changes to take effect?」のようなメッセージが表示された場合は、[Yes] を選択します。
エミュレータのセットアップ
Android Emulator のセットアップについてサポートが必要な場合は、アプリを実行するをご覧ください。
Android アプリのスターター コードを理解する
- スターター コードは、最小限の機能と UI を備えた軽量の Android アプリです。
- firebase-messaging SDK への依存関係は、すでに
app/build.gradle
ファイルに追加されています。
AndroidManifest.xml
では、MESSAGING_EVENT
コールバック ハンドラがすでに追加されています。- このハンドラ
StockNewsMessagingService.java
は、Firebase Cloud Messaging 関連のさまざまな機能を提供するFirebaseMessagingService
クラスを拡張します。詳しくは、FirebaseMessagingService のドキュメントをご覧ください。
onNewToken
関数は、FCM 登録トークンが作成または更新されたときに呼び出されます。詳細については、トークンの生成をモニタリングするをご覧ください。onMessageReceived
関数は、メッセージが受信され、アプリがフォアグラウンドにあるときに呼び出されます。今のところ、これは受信したメッセージをログに記録するだけです。- バックグラウンドとフォアグラウンドでのメッセージの配信と処理の違いについて詳しくは、Android アプリでメッセージを受信するをご覧ください。
- このハンドラ
- また、
AndroidManifest.xml
にはStockNewsApplication
という名前の AndroidApplication
クラスも用意されています。- このクラスは、アプリの起動時に最初にインスタンス化されます。
StockNewsApplication
クラスのonCreate
関数に、FCM 登録トークンの作成呼び出しが追加されています。これにより、有効な FCM 登録トークンが生成され、ログに記録されます。
MainActivity.java
は、銘柄カテゴリの選択肢を表示するRecyclerView
を追加します。SubscriptionAdapter.java
は、在庫カテゴリ選択画面を描画するRecyclerView.Adapter
を実装します。- 各銘柄カテゴリには名前と、その横にサブスクリプションの切り替えボタンがあります。
- 切り替えボタンを変更すると、FCM トピックのサブスクリプション登録または登録解除の呼び出しが行われます。
- これらの呼び出しは以降のセクションで実装します。
model/StockCategories.java
クラスには、すべての在庫カテゴリとそれに関連するトピック名のリストが含まれます。
スターター アプリを実行する
- Android デバイスをパソコンに接続するか、エミュレータを起動します。
- 上部のツールバーで、対象の Android デバイスまたはエミュレータを選択し、実行ボタンを押します。
- アプリの UI は次のようになります。
- アプリは FCM 登録トークンを作成してログに記録します。ただし、アプリの UI に変更はありません。
- 次のステップで使用するため、FCM 登録トークンをコピーして保存します。
5. テスト メッセージを送信する
これで、前のステップで設定したアプリ インスタンスにテスト メッセージを送信できるようになりました。
スターター サーバーコードをインポートする
IntelliJ IDEA を起動し、messaging/fcm-topics-codelab/starter/StockNewsServer
プロジェクトを開きます。
左側のナビゲーション バーのプロジェクト ビューは次のようになります。
必要な依存関係の pull を含め、IntellIj IDEA がプロジェクトをビルドするまでに数分かかることがあります。
サーバーのスターター コードを理解する
- サーバーのスターター コードは、Gradle ベースの Java プロジェクトです。
build.gradle
ファイルには、すでに firebase-admin SDK への依存関係が追加されています。この SDK は、さまざまな FCM メッセージ送信機能へのアクセスを提供します。
- 最後に、次の 2 つのクラスがあります。
FcmSender.java
: このクラスには次のメソッドが含まれます。initFirebaseSDK
: firebase-admin SDK を初期化します。sendMessageToFcmRegistrationToken
: FCM 登録トークンにメッセージを送信します。sendMessageToFcmTopic
: FCM トピックにメッセージを送信します。sendMessageToFcmTopicCondition
: FCM トピック条件にメッセージを送信します。
FcmSubscriptionManager.java
: このクラスには、サーバー側からトピックのサブスクリプションを管理できるメソッドが含まれます。initFirebaseSDK
: firebase-admin SDK を初期化します。subscribeFcmRegistrationTokensToTopic
: FCM 登録トークンを FCM トピックにサブスクライブします。unsubscribeFcmRegistrationTokensFromTopic
: FCM トピックから FCM 登録トークンのサブスクライブを解除します。
サーバーコードの設定
- まず、firebase-admin SDK が FCM API の呼び出しを承認できるように、Firebase サービス アカウントを設定する必要があります。
- Firebase コンソールに移動し、左側のナビゲーション バーの [プロジェクトの概要] の横にある歯車アイコンをクリックして、[プロジェクトの設定] を選択します。
- 設定ページで [サービス アカウント] を選択し、[サービス アカウントを作成] をクリックします。
- 次に、[Generate new private key] ボタンをクリックすると、鍵ファイルの自動ダウンロードが開始されます。
- キーファイルの名前を
service-account.json
に変更し、messaging/fcm-topics-codelab/starter/StockNewsServer/src/main/resources
フォルダにコピーします。 FcmSender.java
とFcmSubscriptionManager.java
はどちらも、次のコードを使用して、クラスパスからservice-account.json
ファイルを読み込みます。
- この時点で、サーバーコードの準備ができています。上部のメニューバーから [Run Build] -> [Build Project] を選択します。
テスト メッセージの送信
FcmSender.java
でsendMessageToFcmRegistrationToken
関数を見つけ、スターター アプリを実行するでコピーした FCM 登録トークンをregistrationToken
フィールドに挿入します。main
関数で、sendMessageToFcmRegistrationToken
関数だけをコメント化解除し、[実行] をクリックしてコードを実行します。- FCM 登録トークンが
message
オブジェクトのToken
フィールドに設定されていることを確認します。 - さらに、
FirebaseMessaging
インターフェースのsend
API をどのように使用しているかにも注目してください。
- FCM 登録トークンが
- これにより、前の手順で設定したアプリ インスタンスにメッセージが送信されます。
- アプリ インスタンスがフォアグラウンドにある場合、ログに記録されたメッセージ コンテンツが表示されます。
- アプリ インスタンスがバックグラウンドで動作しているときは、通知トレイにメッセージが表示されます。
Firebase Admin SDK を使用してアプリ インスタンスにメッセージを送信しました。詳しくは、サーバーでの Firebase Admin SDK の使用をご覧ください。
6. トピックの登録と登録解除を実装する
このステップでは、Android アプリの [株価情報カテゴリ] の切り替えボタンで、トピックの登録と登録解除のアクションを実装します。
アプリのユーザーが特定の株式カテゴリのスイッチを切り替えると、トピックの登録または登録解除が行われます。
コードを確認する
- Android アプリコードの
SubscriptionAdapter.java
クラスに移動し、RecyclerViewViewHolder
クラスを見つけます。
- クラス コンストラクタは、
setOnCheckedChangeListener
を使用してサブスクリプション切り替え用のリスナーをセットアップします。 - 切り替えの切り替えに応じて、
subscribeToStockCategory
メソッドとunsubscribeFromStockCategory
メソッドを呼び出すことで、サブスクライブとサブスクライブのアクションをそれぞれ実行します。 setData
メソッドは、RecyclerView アダプターのonBindViewHolder
によって呼び出され、ViewHolder を適切な在庫カテゴリにバインドします。
トピック サブスクリプションを実装する
subscribeToStockCategory
メソッドで、FirebaseMessaging
オブジェクトのsubscribeToTopic
API の呼び出しを実装します。コードは次のようになります。
void subscribeToStockCategory() { // Making call to FCM for subscribing to the topic for stockCategory FirebaseMessaging.getInstance().subscribeToTopic(stockCategory.getTopicName()).addOnSuccessListener( unused -> { // Subscribing action successful Log.i(TAG, "Subscribed to topic: " + stockCategory.getTopicName()); Toast.makeText(itemView.getContext(), "Subscribed to " + stockCategory.getCategoryName(), Toast.LENGTH_SHORT).show(); }); }
トピックの登録解除を実装する
- 同様に、else 条件で
unsubscribeFromTopic
API の呼び出しを実装します。次のような行です。
void unsubscribeFromStockCategory() { // Making call to FCM for unsubscribing from the topic for stockCategory FirebaseMessaging.getInstance().unsubscribeFromTopic(stockCategory.getTopicName()) .addOnSuccessListener(unused -> { // Unsubscribing action successful Log.i(TAG, "Unsubscribed from topic: " + stockCategory.getTopicName()); Toast.makeText(itemView.getContext(), "Unsubscribed from " + stockCategory.getCategoryName(), Toast.LENGTH_SHORT).show(); }); }
試してみる
- アプリを実行し、株式カテゴリ オプションを切り替えて、Subscribe アクションと Unsubscribe アクションを実行します。これは次のようになります。
登録 | 登録を解除 |
7. 最初のトピック メッセージを送信する
このステップでは、FCM トピック メッセージを送信するサーバー側のコードを実装します。
トピック メッセージを送信するためのサーバーサイドの統合を実装する
- サーバーコードで
FcmSender.java
に移動し、sendMessageToFcmTopic
という名前のメソッドを見つけます。
- 1 行目に、メッセージの送信先の FCM トピックを指定します。
- これは、
/topics/<Topic Name>
という形式の文字列です。例:/topics/Technology
- これは、
- 次の行で新しい
message
オブジェクトを作成します(sendMessageToFcmRegistrationToken
関数で定義されたオブジェクトと同様)。- 違いは、
message
オブジェクトのToken
フィールドを設定するのではなく、Topic
フィールドを設定することです。
- 違いは、
Message message = Message.builder() .putData("FOOTECH", "$1000") .setNotification( Notification.builder() .setTitle("Investor confidence in Tech Stocks growing") .setBody("Foo Tech leading the way in stock growth for Tech sector.") .build()) .setTopic(topicName) .build();
- 次に、メッセージを送信するための
FirebaseMessaging
インスタンスの呼び出しを追加します(sendMessageToFcmRegistrationToken
関数で行われる send の呼び出しと同じです)。
FirebaseMessaging.getInstance().send(message);
- 最後に、
main
関数を更新し、sendMessageToFcmTopic
関数の呼び出しのみを有効にします。
メッセージを送信して領収書を確認する
- トピック メッセージを送信する前に、まずアプリ インスタンスが送信先のトピックにサブスクライブされていることを確認します。
- これを行うには、対応する切り替えスイッチを切り替えます。次に例を示します。
- これで、
FcmSender.java
のmain
関数を実行して、トピック メッセージを送信できるようになりました。 - 前と同じように、アプリ インスタンスでメッセージの受信をモニタリングできます。
- フォアグラウンドのアプリ インスタンス
- バックグラウンドのアプリ インスタンス
- 参考: 送信したトピックの登録を解除して、メッセージを再送信してみてください。メッセージがアプリ インスタンスに配信されていないことがわかります。
8. 最初のトピック条件メッセージを送信する
トピックの条件機能を使用すると、トピックの組み合わせにメッセージを送信できるため、より表現力の高いオーディエンスを定義できます。
たとえば、StockNews アプリでは、「テクノロジー」または「自動車」のトピックのいずれかにサブスクライブしているアプリ インスタンスのグループにメッセージを送信する可能性を検討します。このようなケースは、たとえば Waymo に関連する注目すべき事件がある場合に発生することがあります。
Topics では、次の演算子を使用して組み合わせをブール式の形式で表現できます
- && : 論理 AND。たとえば、
'Technology' in topics && 'Automotive' in topics
では、「テクノロジー」トピックと「自動車」トピックの両方に登録されているアプリ インスタンスのみをターゲットにします。 - || : 論理 OR。例:
'Technology' in topics || 'Automotive' in topics
- テクノロジーまたは自動車のいずれかのトピックに登録されているアプリ インスタンスをターゲットにします。 - () : グループ化用のかっこ。たとえば、
'Technology' in topics && ('Automotive' in topics || 'Energy' in topics)
- テクノロジーと、自動車またはエネルギーのトピックに登録されているアプリ インスタンスのみをターゲットにします。
この機能を使用するための送信リクエストを作成する方法をご確認ください。
トピック条件メッセージを送信するためのサーバーサイドの統合の実装
- サーバーコードに戻り、
FcmSender.java
に移動して、sendMessageToFcmTopicCondition
という名前のメソッドを見つけます。
- 1 行目の
topicCondition
変数に、メッセージの送信先のトピック条件を指定します。'Technology' in topics && 'Automotive' in topics
に設定できます。 - 次の行で新しい
message
オブジェクトを作成します(sendMessageToFcmTopic
関数で定義されたオブジェクトと同様)。- 違いは、オブジェクトの
Topic
フィールドを設定するのではなく、Condition
フィールドを設定することです。
- 違いは、オブジェクトの
Message message = Message.builder() .putData("FOOCAR", "$500") .setNotification( Notification.builder() .setTitle("Foo Car shows strong Q2 results") .setBody("Foo Car crosses 1B miles. Stocks rally.") .build()) .setCondition(topicCondition) .build();
- 次に、メッセージを送信するための
FirebaseMessaging
インスタンスの呼び出しを追加します(sendMessageToFcmTopic
関数で行われる send の呼び出しと同じです)。
FirebaseMessaging.getInstance().send(message);
- 最後に、
main
関数を更新し、sendMessageToFcmTopicCondition
関数の呼び出しのみを有効にします。
メッセージを送信して領収書を確認する
- トピック メッセージを送信する前に、アプリ インスタンスをテクノロジーと自動車の両方のトピックにサブスクライブして、アプリ インスタンスが指定されたトピック条件を満たしていることを確認します。
- これで、
FcmSender.java
のmain
関数を実行して、トピック メッセージを送信できるようになりました。 - 以前と同様に、アプリ インスタンスでメッセージの受信を確認できるはずです。
- フォアグラウンドのアプリ インスタンス
- バックグラウンドのアプリ インスタンス
- 参考: テクノロジー トピックの登録を解除し、トピック条件メッセージを再送信できるようになりました。メッセージがアプリ インスタンスで受信されていないことがわかります。
9. まとめ
ここまでに学習した内容を簡単に復習しましょう。
- アプリ インスタンスからトピックのサブスクリプションまたはサブスクリプションの解除を開始する方法。
- トピックにメッセージを送信し、サブスクライブしたアプリ インスタンスで受信を確認する。
- トピックにメッセージを送信し、その条件を満たすアプリ インスタンスで受信を確認する。
次のセクションでは、クライアントサイドからの呼び出しをインスタンス化することなく、トピックに対してアプリ インスタンスをサブスクライブまたはサブスクライブ解除する方法について説明します。
10. サーバーサイドからトピック サブスクリプションを管理する
これまで、この Codelab では、トピックのサブスクリプションと登録解除の呼び出しはすべて、アプリ インスタンスから開始されていました。
ただし、ユースケースによっては、トピックのサブスクリプションをサーバーサイドから管理したい場合があります。たとえば、アプリのロールアウトを待たずに、既存のユーザーベースのサブグループを新しいトピックにサブスクライブできます。
このセクションでは、Firebase Admin SDK を使用して、サーバー側から呼び出しを行うことで、トピックに対する FCM 登録トークンのバッチのサブスクライブとサブスクライブ解除を行う方法を学習します。
FCM トピックへの FCM 登録トークンのサーバー側サブスクリプションを実装する
- サーバーコードで
FcmSubscriptionManager.java
クラスに移動します。subscribeFcmRegistrationTokensToTopic
という名前のメソッドを見つけます。subscribeToTopic
API の呼び出しはここで実装します。
- アプリ インスタンスをエネルギー トピックにサブスクライブします。それには、まず次の 2 つのフィールドにデータを指定します。
registrationTokens
: トピック サブスクリプションを作成する FCM 登録トークンを表す文字列のカンマ区切りリスト。topicName
: エネルギー トピックのトピック名(例:/topics/Energy
)。
- 次の数行で、これらの行に沿って呼び出しを実装します。
TopicManagementResponse response = FirebaseMessaging.getInstance().subscribeToTopic( registrationTokens, topicName);
TopicManagementResponse
で結果の概要データを調べることができます。たとえば、getSuccessCount
を使用して、正常に作成されたトピック サブスクリプションの数を出力するなどです。
System.out.printf("Num tokens successfully subscribed %d", response.getSuccessCount());
- 最後に、
main
関数で、subscribeFcmRegistrationTokensToTopic
関数の呼び出しのみを有効にします。
サブスクリプションを作成してトピック メッセージを送信する
- これで、トピック サブスクリプションを作成してメッセージを送信する準備が整いました。
FcmSubscriptionManager.java
クラスのmain
関数を実行します。これにより、トピック サブスクリプションが作成されます。- 次に、メッセージを送信するコードを設定します。以前と同様に、
FcmSender.java
で、sendMessageToFcmTopic
関数を見つけます。topicName
をエネルギー トピックに設定します。例:/topics/Energy
Message
オブジェクトを作成し、setTopic
を使用してトピックをターゲットとします。- 最後に、
main
メソッドを更新して、sendMessageToFcmTopic
関数のみを有効にします。
FcmSender.java
のmain
関数を実行します。これにより、メッセージがアプリ インスタンスに送信され、次のようにアプリ内で確認できます。- フォアグラウンドのアプリ インスタンス
- バックグラウンドのアプリ インスタンス
FCM トピックへの FCM 登録トークンのサーバーサイド登録解除を実装する
- サーバーサイドのトピックの登録解除には、こちらの
unsubscribeFromTopic
API を使用します。関連するコードをFcmSubscriptionManager.java
クラスのunsubscribeFcmRegistrationTokensFromTopic
関数に追加します。
- サーバーサイドのサブスクリプション解除コードを実装し、トピック メッセージを送信してその影響を検証する作業は、演習として残しておきます。
11. 完了
これで、FCM トピックを使用してアプリ インスタンスのサブグループにマルチキャスト メッセージを送信できました。これにより、関連性の高いコンテンツでユーザーにタイムリーにリーチする機能が簡素化されます。
次のステップ
Codelab を完了したら、次のガイドに沿って他のプラットフォームのトピックを試すことを検討してください。