次の方法で共有


Firebase Cloud Messaging

Firebase Cloud Messaging (FCM) は、モバイル アプリとサーバー アプリケーション間のメッセージングを容易にするサービスです。 この記事では、FCM の仕組みの概要を示し、アプリで FCM を使用できるように Google サービスを構成する方法について説明します。

Firebase Cloud Messaging hero image

このトピックでは、Firebase Cloud Messaging が Xamarin.Android アプリとアプリ サーバーの間でメッセージをルーティングする方法の概要を示し、アプリで FCM サービスを使用できるように資格情報を取得する方法について、手順を追って説明します。

概要

Firebase Cloud Messaging (FCM) は、サーバー アプリケーションとモバイル クライアント アプリ間のメッセージの送信、ルーティング、キューイングを処理するクロスプラットフォーム サービスです。 FCM は Google Cloud Messaging (GCM) の後継であり、Google Play 開発者サービス上に構築されています。

次の図に示すように、FCM はメッセージ送信元とクライアント間の仲介役として機能します。 "クライアント アプリ" は、デバイス上で実行される FCM 対応アプリです。 "アプリ サーバー" (ユーザーまたは会社によって提供) は、クライアント アプリが FCM を介して通信する FCM 対応サーバーです。 GCM とは異なり、FCM を使用すると、Firebase コンソール通知 GUI を介してクライアント アプリに直接メッセージを送信できます。

FCM sits between the client app and an app server

FCM を使用すると、アプリ サーバーは、1 つのデバイス、デバイスのグループ、またはトピックにサブスクライブされている多数のデバイスにメッセージを送信できます。 クライアント アプリでは、FCM を使用してアプリ サーバーからダウンストリーム メッセージをサブスクライブできます (たとえば、リモート通知を受信するため)。 さまざまな種類の Firebase メッセージの詳細については、「FCM メッセージについて」を参照してください。

Firebase Cloud Messaging の動作

ダウンストリーム メッセージがアプリ サーバーからクライアント アプリに送信されると、アプリサーバーは Google が提供する "FCM 接続サーバー" にメッセージを送信します。次に、FCM 接続サーバーは、クライアント アプリを実行しているデバイスにメッセージを転送します。 メッセージは、HTTP または XMPP (Extensible Messaging and Presence Protocol) 経由で送信できます。 クライアント アプリは常に接続または実行されているとは限らないため、FCM 接続サーバーではメッセージをエンキューして保存し、再接続して使用可能になったときにクライアント アプリに送信します。 同様に、FCM では、アプリ サーバーが使用できない場合に、クライアント アプリからアプリ サーバーにアップストリーム メッセージをエンキューします。 FCM 接続サーバーの詳細については、「Firebase Cloud Messaging サーバーについて」を参照してください。

FCM では、次の資格情報を使用してアプリ サーバーとクライアント アプリを識別し、これらの資格情報を使用して FCM を介してメッセージ トランザクションを認可します。

  • 送信者 ID – "送信者 ID" は、Firebase プロジェクトの作成時に割り当てられる一意の数値です。 送信者 ID は、クライアント アプリにメッセージを送信できる各アプリ サーバーを識別するために使用されます。 送信者 ID はプロジェクト番号でもあります。プロジェクトを登録するときに、Firebase コンソールから送信者 ID を取得します。 送信者 ID の例は 496915549731 です。

  • API キー – "API キー" を使用すると、アプリ サーバーは Firebase サービスにアクセスできます。FCM では、このキーを使用してアプリ サーバーを認証します。 この資格情報は、"サーバー キー" または "Web API キー" とも呼ばれます。 API キーの例は AJzbSyCTcpfRT1YRqbz-jIwp1h06YdauvewGDzk です。

  • アプリ ID – FCM からメッセージを受信するために登録するクライアント アプリの ID (特定のデバイスに依存しません)。 アプリ ID の例は 1:415712510732:android:0e1eb7a661af2460 です。

  • 登録トークン – "登録トークン" ("インスタンス ID" とも呼ばれます) は、特定のデバイス上のクライアント アプリの FCM ID です。 登録トークンは実行時に生成されます。アプリは、デバイスでの実行中に最初に FCM に登録するときに登録トークンを受け取ります。 登録トークンは、(その特定のデバイスで実行されている) クライアント アプリのインスタンスが FCM からメッセージを受信することを認可します。 登録トークンの例は fkBQTHxKKhs:AP91bHuEedxM4xFAUn0z ... JKZS (非常に長い文字列) です。

Firebase Cloud Messaging の設定」(このガイドの後半) では、プロジェクトを作成し、これらの資格情報を生成するための詳細な手順について説明します。 Firebase コンソールで新しいプロジェクトを作成すると、google-services.json という資格情報ファイルが作成されます。「FCM によるリモート通知」の説明に従って、このファイルを Xamarin.Android プロジェクトに追加します。

次のセクションでは、クライアント アプリが FCM を介してアプリ サーバーと通信するときに、これらの資格情報がどのように使用されるかについて説明します。

FCM への登録

メッセージングを実行する前に、まずクライアント アプリを FCM に登録する必要があります。 クライアント アプリは、次の図に示す登録手順を完了する必要があります。

App registration steps diagram

  1. クライアント アプリは FCM に接続して登録トークンを取得し、送信者 ID、API キー、アプリ ID を FCM に渡します。

  2. FCM はクライアント アプリに登録トークンを返します。

  3. クライアント アプリは (必要に応じて) 登録トークンをアプリ サーバーに転送します。

アプリ サーバーで、クライアント アプリとの後続の通信のために登録トークンがキャッシュされます。 アプリ サーバーからクライアント アプリに受信確認を送信して、登録トークンが受信されたことを示すことができます。 このハンドシェイクが行われた後、クライアント アプリではアプリ サーバーからメッセージを受信 (またはメッセージを送信) できます。 古いトークンがセキュリティ侵害を受けた場合、クライアント アプリは新しい登録トークンを受け取る可能性があります (アプリが登録トークンの更新を受け取る方法の例については、「FCM によるリモート通知」を参照してください)。

クライアント アプリがアプリ サーバーからメッセージを受信することを望まない場合は、登録トークンを削除する要求をアプリ サーバーに送信できます。 クライアント アプリがデバイスからアンインストールされた場合、FCM はこれを検出し、登録トークンを削除するようにアプリ サーバーに自動的に通知します。

ダウンストリーム メッセージング

次の図は、Firebase Cloud Messaging がダウンストリーム メッセージを保存および転送する方法を示しています。

FCM uses store and forward for downstream messaging

アプリ サーバーがクライアント アプリにダウンストリーム メッセージを送信する場合は、上の図に示されているとおり、次の手順が使用されます。

  1. アプリ サーバーは FCM にメッセージを送信します。

  2. クライアント デバイスが使用できない場合、FCM サーバーは、後で転送するためにメッセージをキューに保存します。 メッセージは FCM ストレージに最大 4 週間保持されます (詳細については、「メッセージの有効期間の設定」を参照してください)。

  3. クライアント デバイスが使用可能になると、FCM はそのデバイス上のクライアント アプリにメッセージを転送します。

  4. クライアント アプリは FCM からメッセージを受信し、処理してユーザーに表示します。 たとえば、メッセージがリモート通知の場合、通知領域でユーザーに表示されます。

このメッセージング シナリオ (アプリ サーバーが 1 つのクライアント アプリにメッセージを送信する) では、メッセージの長さは最大 4 kB です。

Android でのダウンストリーム FCM メッセージの受信に関する詳細については、「FCM によるリモート通知」を参照してください。

トピック メッセージング

"トピック メッセージング" を使用すると、アプリ サーバーは、特定のトピックにオプトインした複数のデバイスにメッセージを送信できます。 Firebase コンソール通知 GUI を使用してトピック メッセージを作成して送信することもできます。 FCM は、サブスクライブされたクライアントへのトピック メッセージのルーティングと配信を処理します。 この機能は、気象警報、株価情報、ヘッドライン ニュースなどのメッセージに使用できます。

Topic messaging diagram

トピック メッセージングでは、次の手順が使用されます (前述したように、クライアント アプリが登録トークンを取得した後)。

  1. クライアント アプリは、サブスクライブ メッセージを FCM に送信してトピックをサブスクライブします。

  2. アプリ サーバーは、配布のためにトピック メッセージを FCM に送信します。

  3. FCM は、そのトピックにサブスクライブしているクライアントにトピック メッセージを転送します。

Firebase トピック メッセージングの詳細については、Google の「Android でのトピック メッセージング」を参照してください。

Firebase Cloud Messaging の設定

アプリで FCM サービスを使用する前に、Firebase コンソールを使用して新しいプロジェクトを作成する (または既存のプロジェクトをインポートする) 必要があります。 アプリ用の Firebase Cloud Messaging プロジェクトを作成するには、次の手順に従います。

  1. Google アカウント (Gmail アドレスなど) を使用して Firebase コンソールにサインインし、[新しいプロジェクトの作成] をクリックします。

    Create New Project button

    既存のプロジェクトがある場合は、[Google プロジェクトのインポート] をクリックします。

  2. [プロジェクトの作成] ダイアログで、プロジェクトの名前を入力し、[プロジェクトの作成] クリックします。 次の例では、XamarinFCM という新しいプロジェクトが作成されます。

    Create a Project dialog

  3. Firebase コンソールの [概要] で、[Android アプリに Firebase を追加] をクリックします。

    Add Firebase to your Android app

  4. 次の画面で、アプリのパッケージ名を入力します。 この例では、パッケージ名は com.xamarin.fcmexample です。 この値は、Android アプリのパッケージ名と一致する必要があります。 [アプリのニックネーム] フィールドにアプリのニックネームを入力することもできます。

    Entering FCM Example as the app nickname

  5. アプリで Dynamic Links、Invites、または Google Auth を使用する場合は、デバッグ用の署名証明書も入力する必要があります。 署名証明書の検索の詳細については、「キーストアの MD5 または SHA1 署名の検索」を参照してください。 この例では、署名証明書は空白のままにします。

  6. [アプリを追加] をクリックします。

    Clicking the Add App button

    アプリのサーバー API キーとクライアント ID が自動的に生成されます。 この情報は、google-services.json ファイルにパッケージ化されており、「アプリを追加」をクリックすると自動的にダウンロードされます。 このファイルは必ず安全な場所に保存してください。

Android で FCM プッシュ通知メッセージを受信するために google-services.json をアプリ プロジェクトに追加する方法の詳細な例については、「FCM によるリモート通知」を参照してください。

参考資料

まとめ

この記事では、Firebase Cloud Messaging (FCM) の概要について説明しました。 アプリ サーバーとクライアント アプリの間のメッセージングを識別および認可するために使用されるさまざまな資格情報について説明しました。 登録とダウンストリーム メッセージングのシナリオを示し、FCM サービスを使用するために FCM にアプリを登録する手順について詳しく説明しました。