メッセージの優先度を設定、管理する

Android では、ダウンストリーム メッセージに配信の優先度を割り当てるオプションとして、標準(normal)と高(high)の 2 つの優先度があります。標準の優先度と高い優先度のメッセージの配信は、次のように行われます。

  • 優先度: 標準。これはデータ メッセージと通知メッセージのデフォルトの優先度です。デバイスがスリープしていない場合、優先度が標準のメッセージはすぐに配信されます。デバイスが Doze モードの場合は、バッテリーを節約するために Doze モードが終了するまで配信が延期されることがあります。新着メールの通知、UI の同期の維持の通知、バックグラウンドでのアプリデータの同期の通知など、緊急度の低いメッセージでは、標準の配信優先度を選択します。

  • 優先度: 高。優先度の高いメッセージは、FCM によって即時配信が試みられます。その際に FCM は、スリープ状態のデバイスを必要に応じてアクティブにしたり、限られた処理(ごく限定的なネットワーク アクセスなど)を行ったりすることが可能です。通常、優先度の高いメッセージが配信されると、ユーザーによるアプリの操作やその通知の操作が行われることになります。

高い優先度と標準の優先度のメッセージの選択

標準の優先度のメッセージは一般的な更新に適していますが、緊急の事項やアクションについて即時配信を確実に行う必要がある場合は、高い優先度を選択してください。標準の優先度のメッセージの配信時間は Doze モードの影響を受ける可能性があるため、ユーザーに表示される通知のほとんどを高い優先度に設定すると、通知が迅速に配信されます。たとえば、チャット メッセージ、アカウントに関する問題、フード デリバリーの最新情報などの通知は、高い優先度に設定する必要があります。

高い優先度と標準の優先度のメッセージのメッセージ処理

Android デバイスで受信する高い優先度のメッセージと通常の優先度のメッセージの両方で、onMessageReceived ハンドラでメッセージ ペイロードを処理するために数秒が与えられます。ただし、高い優先度のメッセージには、通常の優先度のメッセージよりも若干長い時間が割り当てられます。この時間は、通知をすぐにレンダリングするのに十分な長さであると想定されています。デバイス ストレージから画像を読み込む、サーバーを呼び出して追加のコンテンツを収集するなど、追加の作業を行う必要がある場合は、追加の手順が必要になります。

onMessageReceived メソッドは別のワーカー スレッドで呼び出されます。ベスト プラクティスとして、メッセージ ペイロードを処理し、onMessageReceived メソッド内で通知をすぐに表示する必要があります。onMessageReceived メソッド内で追加の非同期ネットワーク呼び出しを行ったり、別のスレッドでペイロード処理を行ったりしないでください。そうすると、ペイロードが完全に処理される前に、アプリが有効なプロセス ライフサイクルから外れる可能性があります。この場合、送信された特定の FCM メッセージで通知の遅延や欠落が発生することがあります。

メッセージの処理にさらに時間が必要な場合(メッセージ ペイロードに含まれる imageUrl の取得など)は、WorkManager やフォアグラウンド サービスなどのコンストラクトを使用して、アプリのライフサイクルを延長する必要があります。通知が完全に処理されたことを確認するために onMessageReceived メソッドをオーバーライドする場合は、次のガイダンスを使用する必要があります。

  • 優先度の高い通知の場合: Android WorkManager を使用して優先ジョブを開始し、優先度の高い通知に優先処理時間が割り当てられ、通知のレンダリングが完了まで実行されることを確認します。優先度の高い FCM の処理の結果として迅速なジョブの割り当てが使い果たされることを心配する必要はありません。優先度の高い FCM onMessageReceived がディスパッチされた直後にスケジュールされた優先ジョブには、一時的な免除があります。
  • 標準の優先度の通知の場合: Android WorkManager を使用して、代わりに通常の WorkRequest を開始します。これにより、優先処理を使用せずに、通知の処理に必要な追加の作業が最終的に処理されることが確認され、不要なバッテリー使用量の問題が発生しなくなります。

メッセージの優先度を設定する

Admin SDKFCM REST API、Firebase コンソールを使用して、ユーザーに通知を送信できます。Admin SDK と FCM REST API で優先度設定を変更するには、メッセージ JSON ペイロードを更新する必要があります。次のコードサンプルを使用して、優先度を高に設定する方法を確認できます。コンソールから送信される通知の場合、Android 固有の通知フィールドの設定はサポートされていません。

 {
  "message": {
      "notification": {
          "body": "Purchase exceeding $500 detected",
          "title": "Credit card purchase"
      },
      "data": {
          "purchaser": "Your child",
          "items": "Gravity Defier Sneakers"
      },
      "android": {
          "priority": "high"
      },
      "apns": {
          "headers": {
              "apns-priority": "5"
          }
      }
  }
}

Doze モードで高い優先度の通知をテストする

高い優先度の通知がユーザーに届いたときに正しく受信、処理されるようにするには、次の手順に沿って通知をテストします。

  1. Doze モードでアプリをテストするの手順に沿って、デバイスを Doze モードに設定します。
  2. テストデバイスのアプリから FCM 登録トークンにアクセスします。トークンにアクセスする方法については、バックグラウンド アプリにテスト メッセージを送信するをご覧ください。
  3. FCM トークンを取得したら、FCM 通知送信コードまたは、高い優先度の通知に一致する構成パラメータを持つ cURL コマンドを使用して、高い優先度の通知をテストデバイスに送信します。

Android で優先度の高い FCM の優先度を下げる

Android において優先度の高いメッセージは、なるべく早くユーザーに確認してもらう必要のあるコンテンツ向けであり、ユーザーに対する通知の表示が行われます。ユーザー向けの通知になっていないメッセージのパターンが FCM によって検出された場合、そのメッセージの優先度は通常の優先度に下げられることがあります。また、Google Play 開発者サービスの処理に委任されることもあります。

FCM がメッセージの優先度を下げるかプロキシするかを判断する際には、過去 7 日間のメッセージの動作が使用されます。この決定はアプリケーションのインスタンスごとに独立して行われます。優先度の高いメッセージに対応して、ユーザーに対する通知の表示が行われた場合、その後の優先度の高いメッセージに影響を与えることはありません。

Google Play 開発者サービスによる通知の委任

特定の条件を満たす高い優先度の通知メッセージは、優先度が下げられることなく、Google Play 開発者サービスによってプロキシされます。つまり、アプリを起動することなく、アプリに代わって Google Play 開発者サービスによって通知が表示されます。これは、Android デバイスで全体的なユーザー エクスペリエンスを向上させるためです。

プロキシされた通知メッセージにより、受信されるメッセージに関連するアナリティクスが報告される方法が変更されることに注意してください。

  • プロキシされた通知のアナリティクスをレポートするには、アプリで FCM SDK バージョン 24.0.0 以降を使用する必要があります。
  • プロキシされた通知の導入前と比較して、受信するメッセージの数が遅れたり減ったりすることがあります。これは、プロキシされた通知のアナリティクスがアプリの起動時にのみレポートされるためです。通知によってアプリが起動されなかった場合は、レポートがまったく行われないこともあります。

Android Q 以降と Google Play 開発者サービス バージョン 19054000 以降を使用するアプリでは、この方法で通知メッセージをプロキシするのがデフォルトの動作です。HTTP v1 API を介して送信されたメッセージはプロキシされますが、Firebase コンソールまたは従来の API を介して送信されたメッセージはプロキシされません。なお、この機能は現在ベータ版であり、変更される可能性があります。

デバイスのバッテリーとメモリにとってメリットとなるため、委任は有効にしたままにすることを強くおすすめしますが、次のいずれかの方法でこの動作を無効にできます。

  • アプリレベル: アプリ マニフェストに <meta-data android:name= "delivery_metrics_exported_to_big_query_enabled" android:value="false"/> ディレクティブを追加します。
  • アプリ インスタンス単位: アプリ インスタンスの場合は、特定のユースケースに応じて、アプリの UI フローで fun setNotificationDelegationEnabled(disable: Boolean): Task<Void!> を設定します。
  • メッセージ単位: 送信リクエストの AndroidNotification オブジェクトで、proxy キーを DENY に設定します。

Android 向けメッセージの優先度低下の測定

  • 個々のメッセージ。配信時に、配信優先度(getPriority() によって取得)と元の優先度(getOriginalPriority() によって取得)を比較することで、個々のメッセージの優先度が下げられたかどうかを確認できます。

  • すべてのメッセージ。FCM Aggregate Delivery Data API を使用して、Android 向けのすべてのメッセージのうち優先度が下げられたメッセージの割合を確認できます。メッセージによっては集計データのレポートから除外されるものもありますが、全体的に見れば、メッセージの優先度低下の割合に関する包括的な情報が得られます。配信の集計データに関する記事をご覧になり、詳細情報、および API のクエリを実行するサンプルコードを確認してください。また、API Explorer でクエリを試すこともできます。

  • プロキシ経由の通知: プロキシ経由の通知は、現在の FCM または GA の配信指標にはカウントされないため、通知配信指標が最大 15% 減少する可能性があります。プロキシ経由のメッセージのレポートには、FCM Aggregate Delivery Data API を使用します。ProxyNotificationInsightPercents は、正常終了したプロキシ経由の通知の割合と、正常にプロキシできなかったメッセージの詳細を報告します。

通知の遅延に関するトラブルシューティング

  • アプリ インスタンスで通知が有効になっているかどうか確認する。ユーザーがアプリの通知権限を無効にしている場合、通知は配信されません。その結果として、メッセージの優先度が下がります。アプリケーション インスタンスに高い優先度のメッセージを送信する前に通知が有効になっていることを確認してください。

  • 通知の処理時に追加のネットワーク呼び出しを行わないようにします。Android モバイル ユーザーの一部はレイテンシの高いネットワークを利用しているので、通知の表示前にサーバーへの接続を開かないようにしてください。許容処理時間が経過しないうちにサーバーへのコールバックを行うことは、レイテンシの高いネットワーク上のユーザーにとってリスクとなる場合があります。

    代わりに、通知コンテンツを FCM メッセージに含めて、すぐに表示されるようにします。Android で追加のアプリ内コンテンツを同期する必要がある場合は、 WorkManager を使用してタスクのスケジュールを設定し、バックグラウンドでこの処理を行うことができます。