FCM(Firebase Cloud Messaging)は、プッシュ通知の配信とサーバーとモバイルアプリケーション間のデータ転送を行うためのGoogleのクロスプラットフォームサービスです。単一のAPIを通じてAndroid、iOS、ウェブプラットフォームをサポートします。Firebaseドキュメントによると、FCMは世界中で毎日10億以上のメッセージを処理しています。
重要なポイント
Firebase Cloud Messaging(FCM)は、プッシュ通知とデータメッセージをモバイルデバイスに確実に配信するためのGoogleのクラウドサービスです。以前はGoogle Cloud Messaging(GCM)として知られていましたが、FCMはFirebaseエコシステムにおけるクロスプラットフォーム通知の主要ツールになりました。
FCMはプラットフォームに応じて最適な配信チャネルを自動的に選択します。Androidでは独自のFCM接続を使用し、iOSではAPNS(FCMゲートウェイ経由)を使用します。開発者は2つの異なる統合を実装する必要はありません — FCMがルーティングを処理します。
このサービスは、メッセージ送信用の統一されたREST APIとAdmin SDKを提供します。これにより、特定の受信者プラットフォームに縛られることなく、サーバー側から通知を送信できます。
FCMは複数の配信モードをサポートしています:特定のデバイスへの単一メッセージ、トピックによるグループ配信、条件によるセグメント送信。予約送信や通知コンテンツのA/Bテストも利用可能です。
FCMのアーキテクチャは、クライアントアプリケーション、Firebase Connection Server、アプリサーバーの3つのコンポーネントに基づいています。クライアントは起動時にFCMに登録し、一意の登録トークンを受け取ります — これは特定のアプリケーションのデバイスを識別する文字列です。
アプリサーバーは受信者トークンまたはトピックを指定してFCM REST APIにリクエストを送信します。Firebase Connection Serverは永続的なXMPP接続またはHTTPリクエストを使用してメッセージを配信します。デバイスがオフラインの場合、メッセージはキューに入れられ、接続が復元されたときに配信されます。
FCMは優先キューと確認メカニズムを使用して配信を保証します。Androidではメッセージはキューに最大28日間保存され、iOSでは最大4週間(APNS経由)保存されます。有効期限が切れると、メッセージは通知なしで削除されます。
登録トークンはいくつかのケースで変更される可能性があります:アプリデータの復元時、新しいバージョンへのアップデート時、キャッシュのクリア時。アプリはトークンの更新を処理し、サーバーと同期するためにFirebaseMessagingService.onNewTokenを実装する必要があります。
FCMは通知とデータの2つのタイプのペイロードをサポートしています。各タイプは、受信者デバイスでメッセージがいつどのように処理されるかを決定します。
| パラメータ | Notification | Data |
|---|---|---|
| 自動表示 | はい(アプリがバックグラウンドの場合) | いいえ(アプリ内のみ) |
| 処理 | システム/NOS — バックグラウンド; アプリ — フォアグラウンド | 常にアプリ内(onMessageReceived) |
| 最大サイズ | 4 KB | 4 KB |
| カスタムキー | 事前定義されたフィールドに限定 | 任意のキーと値のペア |
| CollapseKeyの必要性 | オプション | グループ化にオプション |
実際には、アプリがonMessageReceivedで完全な通知処理を必要とする場合は、dataメッセージを使用することをお勧めします。Notificationメッセージは、システム表示で十分な単純なシナリオに適しています。
FCMとAPNSは2つの主要なプッシュ配信サービスです。FCMはクロスプラットフォームゲートウェイとして機能し、APNSはAppleエコシステム専用です。主な違いは、アーキテクチャ、証明書要件、ルーティングメカニズムにあります。
FCMと直接APNSの選択はプロジェクトのアーキテクチャに依存します。クロスプラットフォームアプリケーションにはFCMが最適な選択です。iOSのみのプロジェクトでは、HTTP/2 APIを介した直接APNSの使用が許容されます。
FCMは、プロジェクトがAndroidとiOSを同時に使用する場合、およびFirebase分析、通知のA/Bテスト、サーバーロジックなしのトピックが必要な場合に適しています。直接APNSは、依存関係が最小限で配信遅延の厳格な要件があるiOSのみのアプリケーションに適しています。
AndroidアプリケーションにFCMを接続するには、Firebase SDKを追加し、プロジェクトルートにgoogle-services.jsonを設定する必要があります。トークン登録後、アプリケーションはFirebaseMessagingServiceを介してメッセージを受信できるようになります。
// build.gradle (Module)
dependencies {
implementation("com.google.firebase:firebase-messaging:24.1.0")
}
// AndroidManifest.xml
<service android:name=".MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
class MyFirebaseMessagingService :
FirebaseMessagingService() {
override fun onNewToken(token: String) {
sendTokenToServer(token)
}
override fun onMessageReceived(message: RemoteMessage) {
message.notification?.let {
showNotification(it.title, it.body)
}
}
}
セットアップ後、アプリケーションは初回起動時に自動的にFCMトークンを受け取ります。このデバイスへのその後の通知配信のために、トークンをアプリサーバーに送信する必要があります。
Android 8+では、自動表示のFCM通知を送信する前に、NotificationChannelを作成する必要があります。FCM通知メッセージはデフォルトのチャネルIDを使用しますが、最初のメッセージを受信したときにFirebaseMessagingServiceを介してカスタムチャネルを作成することをお勧めします。Dataメッセージにはチャネルは必要ありません — アプリ自体が通知をいつどのように表示するかを決定します。
iOSでは、FCMはアプリサーバーとAPNSの間の仲介役として機能します。Firebaseはサーバーからメッセージを受信し、APNS形式にラップしてAppleゲートウェイを介して送信します。開発者はFirebaseコンソールでAPNSキーまたは証明書を設定する必要があります。
import FirebaseMessaging
import UserNotifications
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions options: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
FirebaseApp.configure()
UNUserNotificationCenter.current().delegate = self
Messaging.messaging().delegate = self
return true
}
}
extension AppDelegate: MessagingDelegate {
func messaging(
_ messaging: Messaging,
didReceiveRegistrationToken fcmToken: String?
) {
UserDefaults.standard.set(fcmToken, forKey: "fcm_token")
}
}
iOSでは、APNS登録は非同期で行われます。FCM SDKは自動的にAPNSトークンを取得し、Firebaseサーバーに渡します。didReceiveRegistrationTokenは、新しいFCMトークン(APNSトークンとプロジェクトIDを組み合わせたもの)を受信したときに起動します。
FCMは配信監視用のFirebaseコンソールを提供します:送信、受信、表示された通知の数。サーバー側の配信エラーを追跡するために、Firebase Cloud Functionsを介したステータスコールバックも利用可能です。主要な指標:通知のインプレッション数と開封数。
FCMを使用する際は、各シナリオに適したメッセージタイプを選択することが重要です。自動表示のシンプルな通知にはnotificationメッセージを使用します。表示前にアプリがデータを処理する必要がある場合は、dataメッセージを使用します。混合タイプ(notification + data)は、通知コンテンツを変更するためではなく、分析用にデータが必要な場合にのみ推奨されます。
トークンを集中管理します。現在のトークンをユーザーとプラットフォームにリンクされたテーブルでサーバーに保存します。古いトークンのクリーンアップメカニズムを実装します:NotRegisteredまたはInvalidRegistrationエラーが発生した場合、データベースからトークンを削除します。トークンはめったに変更されませんが、そのクリーンアップはFCMサポートの必須要素です。
メッセージをグループ化するためにコラプスキー(collapseKey)を使用します。同じタイプの複数の通知を送信する場合(例:「為替レートの更新」)、同じcollapseKeyを設定します。FCMはグループから最後のメッセージのみを配信し、デバイスの負荷を軽減し、ユーザーに通知が殺到するのを防ぎます。
Firebase ConsoleとCloud Functionsを通じて配信を監視します。FCM分析は、送信、受信、表示された通知の数を示します。表示率が70%未満の場合は、Androidのチャネル設定とiOSの許可設定を確認してください。配信率が低いのは、無効なチャネルや通知禁止が原因であることがよくあります。5つ目:Firebase A/Bテストを使用して通知テキストと送信時間を最適化します — Firebaseのデータによると、これにより開封率が15~25%向上します。
よくある質問
FCMはGCM(Google Cloud Messaging)の進化版です。FCMはFirebase Consoleによる簡素化されたセットアップ、組み込み分析、トピック、Web Pushサポートを提供します。GCMは2019年4月に正式に廃止され、すべてのプロジェクトをFCMに移行する必要があります。
Firebase Cloud Messagingは無料のサービスで、メッセージ数に制限はありません。Cloud FunctionsやFirestoreなど他のFirebaseサービスの使用に対してのみ料金が発生します。基本的な通知配信にFCMはSparkやBlazeのサブスクリプションを必要としません。
FCMトークンは以下の場合に変更されます:バックアップからアプリを復元する場合、アプリデータをクリアする場合、再インストールする場合、Sender IDが変更された新しいバージョンにアップデートする場合。新しいトークンをサーバーに送信するために、FirebaseMessagingServiceで常にonNewTokenを処理してください。
GoogleのFCMは中国ではブロックされています。中国での通知配信には、Huawei Push Kit、MiPush(Xiaomi)、Oppo Push、Vivo Pushなどの代替サービスが使用されています。クロスプラットフォーム配信には、Getuiなどのマルチプロバイダーサービスが使用されています。
組み込みのFirebaseコンソールを使用します:「Cloud Messaging」→「Send Test Message」を選択します。テストトークンを入力し、notificationメッセージを送信します。デバイスに通知が表示されるはずです。FirebaseMessagingService.onMessageReceivedのログも監視できます。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。