FCM 登録トークン管理のベスト プラクティス

FCM API を使用してプログラムで送信リクエストを作成する際に、時間の経過とともに、古い登録トークンを使用して非アクティブなデバイスにメッセージを送信することによってリソースが無駄になる場合があります。この状況は、Firebase コンソールで報告されるメッセージ配信データや BigQuery にエクスポートされるデータに影響し、配信率の大きな(ただし実際は正しくない)低下として示されることがあります。このガイドでは、メッセージ ターゲティングを効率化し、有効な配信レポートを生成するのに役立つ、いくつかの手法について説明します。

基本的なベスト プラクティス

FCM API を使用してプログラムで送信リクエストを作成するアプリでは、いくつかの基本的なプラクティスに従う必要があります。主なベスト プラクティスは次のとおりです。

  • 登録トークンをサーバーに保存する。このサーバーの重要な役割は、各クライアントのトークンを追跡し、アクティブなトークンの最新リストを保持することです。コードとサーバーにトークンのタイムスタンプを実装し、このタイムスタンプを定期的に更新することを強くおすすめします。
  • 保存済みの古くなったトークンを削除する。トークンのレスポンスが無効という明らかなトークン削除のケースに加えて、トークンが古くなっていることを示す他の兆候をモニタリングする必要があります。このガイドでは、これを行うためのオプションをいくつか説明します。

登録トークンを取得して保存する

アプリを初めて起動すると、クライアント アプリのインスタンスの登録トークンが FCM SDK によって生成されます。このトークンは、API によるターゲット設定された送信リクエストに含める必要があります。また、トピックのターゲティングを行う際にトピック登録に追加する必要があります。

クライアント設定ガイドに記載されているように、アプリは最初の起動時にこのトークンを取得し、タイムスタンプと一緒にトークンをアプリサーバーに保存する必要があります。このタイムスタンプは FCM SDK では提供されないため、自らのコードとサーバーによって実装する必要があります。

また、トークンをサーバーに保存し、次のような変更時にタイムスタンプを更新することも重要です。

  • アプリが新しいデバイスで復元される場合
  • ユーザーがアプリをアンインストール / 再インストールする場合
  • ユーザーがアプリのデータを消去する場合

FCM バックエンドからの無効なトークン レスポンスを検出する

FCM からの無効なトークンのレスポンスを検出し、無効なことが判明した登録トークンをシステムから削除するようにします。HTTP v1 API では、次のエラー メッセージが返された場合、ターゲット設定された送信リクエストで古いトークンまたは無効なトークンが使用されている可能性を示しています。

  • UNREGISTERED(HTTP 404)
  • INVALID_ARGUMENT(HTTP 400)

詳細については、エラーコードをご覧ください。

ターゲット設定されたトークンに関してこのレスポンスのいずれかを受け取った場合は、そのトークンが今後再び有効になることはないため、そのトークンのレコードを削除しても安全です。ただし、トークンが実際に無効であっても、それが示されない場合もあることに注意してください。たとえば、デバイスが永続的にオフラインになったかどうかを FCM バックエンドが確認できないことがあります。

登録トークンの鮮度を確保する

トークンの鮮度の判断は簡単ではありません。すべてのケースに対応できるように、トークンが古くなったとみなされるしきい値を採用する必要があります。推奨は 2 か月です。トークンが 2 か月以上経過した場合、そのデバイスは非アクティブである可能性が高いです。デバイスがアクティブであれば、その間にトークンを更新しているでしょう。

トークンを定期的に更新する

サーバー上のすべての登録トークンを定期的に取得して更新することをおすすめします。これには、以下のことが必要です。

  • クライアント アプリにアプリロジックを追加して、適切な API 呼び出し(Apple プラットフォームでは token(completion):、Android では getToken() など)を使用して現在のトークンを取得します。次に、現在のトークンをアプリサーバーに送信し、タイムスタンプとともに保存します。これは、すべてのクライアントとトークンを対象にした月次ジョブになります。
  • トークンが変更されたかどうかにかかわらず、トークンのタイムスタンプを定期的に更新するためのサーバー ロジックを追加します。

どのようなタイミング パターンを使用しているかに関係なく、トークンは定期的に更新してください。1 か月に 1 回の更新頻度は、バッテリーへの影響と非アクティブな登録トークンの検出のバランスを取るのに最適です。この更新により、非アクティブになったデバイスが再びアクティブになったときに、登録が更新されるようにできます。更新頻度を週 1 回以上にする利点はありません。

古いトークンをトピックから登録解除する

トピックの登録を管理して古い登録トークンを削除することも検討してください。これは次の 2 つのステップで構成されます。

  1. アプリで、月に 1 回、または登録トークンが変更されたときに、トピックに再登録するようにします。これは、アプリが自分自身を修復するソリューションとなり、アプリが再びアクティブになると登録が自動的に再開されます。
  2. アプリ インスタンスが 2 か月間(または独自の鮮度期間)アイドル状態である場合は、Firebase Admin SDK を使用してトピックから登録を解除し、トークンとトピックのマッピングを FCM バックエンドから削除するようにします。

この 2 つの手順の利点は、ファンアウト対象に含まれる古いトークンが少なくなるためにファンアウトが高速になること、古いアプリ インスタンスが再びアクティブになると自動的に再登録されることです。

配信の成功を測定する

通常は、アクティブに使用されているアプリ インスタンスで観測またはキャプチャされたアクションに基づいて、メッセージのターゲットを設定することをおすすめします。登録者の多いトピックに定期的にメッセージを送信している場合、これは特に重要です。ある程度の割合で非アクティブになる登録者が発生すると、配信の統計データへの影響は時間とともに増大していきます。

トークンをターゲットにしたメッセージ送信を行う前に、次の点を考慮してください。

  • Google アナリティクス、BigQuery で取得されたデータ、または他のトラッキング シグナルによって、トークンがアクティブであることが示されているか。
  • 一定期間、連続して配信に失敗したか。
  • 過去 2 か月の間にサーバーの登録トークンが更新されたか。
  • Android デバイスの場合、FCM Data API によって、droppedDeviceInactive によるメッセージ配信エラーの割合が高いと報告されるか。

配信の詳細については、メッセージ配信についてをご覧ください。