メッセージの有効期間を設定する

FCM では通常、メッセージが送信されるとすぐに配信されます。しかし、常にそのように動作するとは限りません。たとえば、デバイスが利用できない場合や、アプリによる過剰なリソースの消費やバッテリー寿命への悪影響を防ぐために FCM が意図的にメッセージの配信を遅らせる場合などがあります。

このような場合、FCM はメッセージを保存しておき、できるだけ早く配信します。ほとんどの場合は、これで問題ありませんが、アプリによっては通知の遅延が許されないことがあります。たとえば、着信の通知やイベントへの招待などです。

Android およびウェブでは、メッセージの最大有効期間を指定できます。その値は 0~2,419,200 秒(28 日)の間で設定する必要があります。28 日は FCM が配信を試みるまでにメッセージを保存できる最大期間です。デフォルトでは、このフィールドがないリクエストの有効期間は最長の 4 週間(28 日)です。

iOS では、ApnsConfig オブジェクトで apns-expiration ヘッダーを設定できます。詳しくは、APNs への通知リクエストの送信に関する Apple のドキュメントをご覧ください。

この機能には以下のような用途が考えられます。

  • ビデオチャットの通話着信
  • 期限が近づいている招待イベント
  • カレンダーの予定

メッセージの有効期間を指定するもう 1 つの利点として、FCM では有効期間の値が 0 秒のメッセージに対して、折りたたみ可能なメッセージのスロットリングが適用されないことが挙げられます。ttl の値を 0 にすると、直ちに配信できないメッセージは破棄されることに注意してください。ただし、こうしたメッセージは保存されることがないため、通知メッセージの送信についてはレイテンシが最小になります。

以下に、TTL を含むリクエストの例を示します。

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "data":{
      "Nick" : "Mario",
      "body" : "great match!",
      "Room" : "PortugalVSDenmark"
    },
    "apns":{
      "headers":{
        "apns-expiration":"1604750400"
      }
    },
    "android":{
      "ttl":"4500s"
    },
    "webpush":{
      "headers":{
        "TTL":"4500"
      }
    }
  }
}

メッセージの有効期間

アプリサーバーが FCM にメッセージを送信し、メッセージ ID を受け取っても、メッセージがすでにデバイスに配信されたことを意味するわけではありません。これは、単にメッセージが配信のために受理されたことを意味します。メッセージが配信されるタイミングは、さまざまな要因によって異なります。

デバイスが接続されていても Doze モードになっている場合、優先度の低いメッセージはデバイスが Doze 状態でなくなるまで FCM で保管されます。collapse_key が設定されていて、同じ折り畳みキーと登録トークンを持つメッセージがすでに保存されていて、配信待ちになっている場合、古いメッセージは破棄され、新しいメッセージが設定されます。しかし、折りたたみキーが設定されていない場合は、新しいメッセージも古いメッセージも今後の配信のために保存されます。

デバイスが FCM に接続されていない場合、メッセージは接続が確立されるまで保存されます。接続が確立されると、保留中のすべてのメッセージが FCM によってデバイスに配信されます。そのデバイスの再接続が一度も行われなかった場合、メッセージは最終的にタイムアウトし、FCM ストレージから破棄されます。ttl フラグが設定されていない場合、デフォルトのタイムアウトは 4 週間になっています。FCM がデバイスへのメッセージ配信を試みても、アプリがアンインストールされていた場合、FCM はそのメッセージをすぐに破棄し、登録トークンを無効にします。それ以降、そのデバイスにメッセージを送信しようとすると NotRegistered エラーが発生します。

Android デバイスの場合、デバイスが 1 か月以上 FCM に接続されていない場合、FCM は引き続きメッセージを受け取りますが、すぐに破棄します。最後のデータ メッセージの送信から 4 週間以内にデバイスが接続した場合、クライアントは onDeletedMessages() コールバックを受け取ります。

Android または Apple プラットフォームでのメッセージ配信の詳細については、FCM レポート ダッシュボードをご覧ください。このダッシュボードには、Android アプリのインプレッションのデータとともに、Apple と Android のデバイスで送信および開封されたメッセージの数が記録されています。