Quantcast
Channel: Google Developers Japan
Viewing all articles
Browse latest Browse all 2207

FCM が端末に送るメッセージの生存期間

$
0
0
この記事は Pinar Ozlen による The Firebase Blog の記事 "Life of a message from FCM to the device" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。




Pinar Ozlen
ソフトウェア エンジニア


Firebase Cloud Messaging(FCM)をお使いなら、さまざまな方法でメッセージを送信できることをご存知でしょう。特定の端末上のアプリをターゲットにすることも、トピック API を使ってたくさんのユーザーをターゲットにすることもできます。FCM の API は、リクエストの処理に失敗するとエラーコードとその説明を返すので、失敗したことがわかります。ただし、それが当てはまるのは、皆さんと FCM バックエンド間のリクエストの一部だけです。では、FCM がメッセージ リクエストを受けると、何が起こるのでしょうか。
この投稿では、Firebase Cloud Messaging のインフラストラクチャと、メッセージが実際に端末に配信される仕組みについて解説します。


メッセージの受け入れ

FCM が API リクエストに対して成功応答を返した場合、これは単に、FCM が端末または端末にメッセージを配信するサービス(例: iOS 端末に配信する場合は Apple Push Notification サービス、Firefox ブラウザに配信する場合は Mozilla Push Service)にメッセージ配信の試行を始めるという意味にすぎません。この試行は、以下のいずれかの条件が満たされるまで繰り返されます。
  1. メッセージの有効期限が切れる: メッセージの有効期限は、API を通して設定できます。FCM が再試行する期間は最長 28 日間で、これが既定値になっています。
  2. リクエストしたメッセージが別のメッセージで置き換えられる: 折りたたみキーを設定することで、メッセージを新しいバージョンのメッセージで置き換えることができます。その一例として、最新のスコアをユーザーに伝えるスポーツ アプリがあげられます。意味があるのは最新メッセージだけです。
  3. 端末が 1 か月以上オンラインになっていない: FCM が端末の接続についての情報を持っており、端末が 1 か月以上オンラインになっていないことがわかっている場合、FCM はメッセージを受け入れますが、実際には配信を試行しません。端末が再びオンラインになると、FCM は保留中のメッセージが削除されたことをアプリに通知します。
    1. Android では、端末が再びオンラインになると、FCM が onDeletedMessages()を呼び出します。
    2. iOS では、アプリが開かれたときに FCM が FIRMessagingMessagesDeletedNotificationを呼び出し、保留中のメッセージが削除されたことをアプリに通知します。 注: 保留中のメッセージが有効期間を過ぎた場合、これらの関数が呼ばれることはありません。


メッセージの配信

実際の端末へのメッセージの配信と、FCM が提供できる配信情報の量には、多くの要素が影響しています。

共通の要素

  1. 端末がオフラインになっている: 端末がオンラインでない場合、FCM はメッセージを配信できません。オフラインになる端末は多く、二度とオンラインにならない端末もあります。FCM はこのような端末のアプリに送られたメッセージも受け入れを続けますが、端末が再びオンラインにならない限り、メッセージが配信されることはありません。
  2. メッセージの優先度: FCM API を使ってメッセージの優先度を高または通常に設定することができます。Android、iOSのどちらのプラットフォームでも、電池を最適化しつつ、設定に応じてメッセージを配信します。

Android の要素

  1. Doze モード: FCM は、端末が Doze モードになっている場合、それが解除されるまで優先度が通常のメッセージの配信を控えます。優先度高のメッセージは即座に送信されますが、端末の Android アプリ スタンバイ バケット ポリシーによる制限を受けます(Android P 以降)。
  2. アプリ スタンバイ バケット: Android P 以降では、すべてのアプリがアプリ スタンバイ バケットに従います。そのため、メッセージの優先度を高に設定しても、アプリを復帰させるための割り当てが十分でない場合、端末がメッセージの配信を遅らせる場合があります。詳細については、こちらをご覧ください。
  3. バックグラウンド制限: Android は、アプリがバックグラウンドで実行されているときは、機能を制限します。アプリを強制的に停止した場合や、アプリがこの制限に従っていない場合、メッセージがアプリに配信されない場合があります。
  4. ユーザーによるバックグラウンド制限: FCM は、ユーザーがバックグラウンド制限を設定しているアプリにはメッセージを配信しません。
  5. アンインストールされたアプリ: FCM が端末へのメッセージ配信を試みたもののアプリがアンインストールされていた場合、端末はただちにメッセージを破棄し、登録トークンを無効にします。それ以降、その端末にメッセージを送信しようとすると、API のレスポンスは 'NotRegistered' エラーとなります。
注: プロジェクトのメッセージ配信イベントを分析したい場合は、FCM データを BigQuery にエクスポートして分析できます。

iOS の要素

FCM は、iOS 端末に対して次の 2 つの方法でメッセージを送信します。
  1. APN チャンネル:最もよく使われるのは、APN 経由でメッセージを送信する方法です。FCM v1 HTTP API を使ってメッセージ配信をリクエストしている場合や、以前の FCM API を使って表示メッセージを送信している場合は、FCM が APN にアクセスして通知を配信します。APN がメッセージ リクエストを受け入れると、端末に通知を配信するのは APN の役割になります。この場合、FCM 自体は配信情報を収集しません。APN から送信されるメッセージは、他の APN メッセージと同様のメッセージ配信要素の影響を受けることになります。APN 経由の iOS 端末への配信に影響を与える要素の詳細については、こちらをご覧ください。
  2. FCM ダイレクト チャンネル: iOS 端末にメッセージを送るもう 1 つの方法は、FCM ダイレクト チャンネルです。以前の FCM API を使ってデータのみのメッセージを送信し、かつ shouldEstablishDirectChannelメソッドでダイレクト チャンネル接続を有効にしている場合、メッセージはダイレクト FCM チャンネル経由で配信されます。アプリがバックグラウンドで動作している、または閉じられている場合、FCM バックエンドはメッセージ キューを使って保留中のメッセージを追跡します。アプリがフォアグラウンドになって再接続されると、チャンネルが自動的にクライアントに保留中のメッセージを送信します。これは、クライアントからの確認応答を受信するまで繰り返されます。 注: iOS で表示用の通知の配信情報にアクセスしたい場合は、FCM Reporting Dashboard を使用できます。このダッシュボードは、Firebase 向け Google アナリティクスのデータ共有機能を使い、Android および iOS の Firebase SDK 経由で表示用の通知の配信情報を収集します。

ウェブの要素

  1. Android の制限: Android のブラウザでウェブアプリを実行している場合、「Android の要素」に記載したすべての制限がウェブにも適用されます。
  2. プッシュ サービス: Push API 対応のブラウザ上で動作しているウェブアプリにプッシュ通知を配信し、そのブラウザが別のプッシュ サービスを使ってメッセージを配信している場合、FCM はそのプッシュ サービスにメッセージを渡して配信してもらいます。メッセージを渡した後は、メッセージを配信するのはそのプッシュ サービスの役割となります。そのため、プッシュ サービスによっては、別の制限が課される可能性があります。
メッセージの受け入れと配信の詳細については、メッセージの有効期間およびメッセージ配信についてをご覧ください。


Reviewed by Khanh LeViet - Developer Relations Team

Viewing all articles
Browse latest Browse all 2207