Firebase Cloud Messaging(FCM)は、モバイルおよびウェブアプリケーション向けに設計された、Googleによるクロスプラットフォームのプッシュ通知およびメッセージ配信サービスです。FCMは、永続的なネットワーク接続を維持する必要なく、サーバーとクライアントデバイス間の信頼性の高いデータ転送を保証します。Firebase Documentation、2026によると、FCMインフラストラクチャを通じて世界中で毎日3,000億以上のメッセージが処理されています。このサービスは、自動表示される通知と、バックグラウンドでのデータ転送用のdataメッセージの両方をサポートしています。
重要なポイント
Firebase Cloud Messagingは、アプリケーションサーバーとクライアントデバイス間でプッシュ通知とdataメッセージの配信を保証するGoogleのクラウドサービスです。このサービスは従来のGoogle Cloud Messaging(GCM)を置き換え、Firebaseエコシステムにおけるプッシュ配信の標準ソリューションになりました。FCMはAndroid、iOS、Web、Unityをサポートし、ターゲットプラットフォームに関係なく統一された送信インターフェースを提供します。
このサービスは、メッセージ配信のための複数のメカニズムを提供し、それぞれが特定のタスクを解決します。Notificationメッセージは受信時にシステムによって自動表示されるため、開発者が通知を表示するコードを書く必要はありません。Dataメッセージはキーと値のペアとして任意のペイロードを転送し、アプリケーション内で処理されます。複合メッセージには、最大の柔軟性を得るために可視部分と非表示部分の両方が含まれています。
独自のプッシュサーバーを実装するには、各デバイスとの永続的なTCP接続を維持する必要があり、非効率的で安全ではありません。FCMはGoogleの統一インフラストラクチャを使用し、同時に何十億ものデバイスとの接続を維持します。このサービスは、配信再試行、メッセージキュー、負荷分散を自動的に管理し、開発者がこれらのタスクを自分で解決する必要をなくします。
FCMのアーキテクチャは、プロバイダーサーバー(バックエンド)、Firebase Cloud Messagingサーバー、デバイス上のクライアントアプリケーションの3つの主要コンポーネントで構成されています。サーバーがメッセージを送信すると、最初にFCMインフラストラクチャに到達し、FCMがターゲットデバイスにルーティングします。デバイスがオフラインの場合、FCMはメッセージをキューに保存し、接続が回復したときに配信します。
初回起動時に、アプリケーションはFirebase SDKを呼び出し、FCMサービスにデバイスを登録して一意のRegistration Tokenを受け取ります。このトークンは約150文字の文字列で、特定のデバイス上の特定のアプリケーションインスタンスを識別します。トークンは、アプリケーションの再インストール、データの消去、またはバックアップからの復元時に変更される可能性があるため、開発者はonNewTokenデリゲートを通じてトークンの更新を処理する必要があります。
サーバーがFCM APIを通じてリクエストを送信すると、メッセージはいくつかの段階を経ます。受信と検証 — FCMはリクエストの妥当性とターゲットデバイスの存在を確認します。キュー — デバイスが利用不可の場合、メッセージはストレージキューに入ります。ルーティング — FCMが最適な配信チャネル(WiFiまたはモバイルデータ)を決定します。配信 — システムがターゲットアプリケーションにメッセージを送信します。配信成功後、FCMはサーバーにメッセージIDを返します。
Firebase Cloud Messagingは3つのメッセージタイプをサポートしており、それぞれクライアント側で独自の処理特性を持っています。NotificationメッセージはAndroidではGoogle Play Services、iOSではAPNsによって処理され、自動的にプッシュバナーとして表示されます。Dataメッセージはアプリケーションに直接配信され、AndroidではonMessageReceivedコールバック、iOSではapplication(_:didReceiveRemoteNotification:)を通じて処理されます。
Notificationメッセージには、title、body、画像URL、通知音などの定義済みフィールドが含まれています。システムが自動的に通知を作成してシステムトレイに表示します。アプリケーションがバックグラウンドにあるか終了している場合でも同様です。ユーザーはタイトルとテキストの標準バナーを表示し、タップするとペイロードで送信されたデータとともにアプリケーションが開きます。アプリケーションがアクティブな場合、notificationメッセージをインターセプトしてコードで処理できます。
Dataメッセージは、定義済みフィールドのないキーと値のペアのカスタムセットです。ペイロードはシステムによって自動的に処理されず、アプリケーションが生データを受け取り、任意に解釈できます。Dataメッセージは、バックグラウンドでのデータ同期、ローカルキャッシュの更新、同期トリガー、または通知を表示せずにコマンドを送信するために使用されます。Androidでは、アプリケーションが終了しているかバックグラウンドにある場合でも、dataメッセージは常に配信されます。
FCMでは、通知部分(表示用)とデータ部分(処理用)の両方を含むメッセージを送信できます。複合ペイロードには、定義済みのnotificationフィールドと任意のdataキーの両方が含まれます。システムはnotification部分から通知を表示し、data部分は開いたときにアプリケーションのインテントエクストラに渡されます。これは、ユーザーに通知を表示すると同時に、特定の画面に移動するためのコンテキストを渡す必要があるシナリオに便利です。
| タイプ | 自動表示 | バックグラウンド処理 | 例 |
|---|---|---|---|
| Notification | はい、システムによる | 自動、コード不要 | ウェルカムプッシュ通知 |
| Data | いいえ | アプリケーションコールバック経由 | バックグラウンドデータ同期 |
| 複合 | はい、notification部分 | 開封時にdata部分 | 通知+注文リンク |
AndroidへのFCM統合は、アプリケーションレベルでbuild.gradleファイルを通じてFirebase SDKを接続することから始まります。依存関係とgoogle-services.jsonファイルを追加した後、アプリケーションは自動的にRegistration Tokenを受け取り、FirebaseMessagingServiceコールバックを通じて渡されます。通知を受信するには、FirebaseMessagingServiceを拡張するサービスを作成し、AndroidManifest.xmlに登録する必要があります。
Firebase SDKを接続した後、デバイストークンは追加コードなしで自動的に生成されます。トークンはFirebaseMessaging.getInstance().tokenを通じて利用可能で、Task<String>を返します。トークンの更新を追跡するには、サービス内でonNewTokenメソッドをオーバーライドします。サーバーがこのデバイスにプッシュ通知を送信できるように、トークンをプロバイダーサーバーに送信する必要があります。
class MyFirebaseMessagingService :
FirebaseMessagingService() {
override fun onNewToken(token: String) {
sendTokenToServer(token)
}
override fun onMessageReceived(
message: RemoteMessage
) {
val data = message.data
val title = "新しいメッセージ"
val body = data["body"] ?: ""
showNotification(title, body)
}
}
FCMメッセージを受信するためのサービスは、適切なintent-filterとともにAndroidManifest.xmlに登録する必要があります。INTERNET権限と指定されたアクションを持つserviceタグを追加します。サービスの登録がないと、メッセージはバックグラウンドでアプリケーションに配信されません。Android 13+で通知を表示するには、実行時権限POST_NOTIFICATIONSが必要です。
<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name=
"android.permission.POST_NOTIFICATIONS" />
<service
android:name=".MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name=
"com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
iOSへのFCM統合には、Apple Push Notification Service(APNs)側とFirebase Consoleの両方での設定が必要です。FCMが直接接続を管理するAndroidとは異なり、iOSではFCMはトランスポート層としてAPNsを使用します。アプリケーションはUIApplication.shared.registerForRemoteNotificationsを通じてプッシュ通知に登録し、Firebase SDKが受信したデバイストークンをインターセプトしてFCM Registration Tokenにリンクします。
iOSでFCMを機能させるには、Firebase ConsoleにAPNsキーまたは証明書をアップロードする必要があります。APNsキーは、証明書なしの最新の認証方法であり(Apple推奨)、Apple Developer PortalのKeysセクションで作成され、Firebase ConsoleのCloud Messaging設定にアップロードされます。APNs設定後、アプリケーションはUNUserNotificationCenterを通じて通知許可を要求し、APNs経由で登録します。
import Firebase
import UserNotifications
class AppDelegate: NSObject, UIApplicationDelegate {
func application(
_ application: UIApplication,
didFinishLaunchingWithOptions
launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
FirebaseApp.configure()
UNUserNotificationCenter.current()
.requestAuthorization(options: [.alert, .sound, .badge])
application.registerForRemoteNotifications()
return true
}
func application(
_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken
deviceToken: Data
) {
Messaging.messaging()
.apnsToken = deviceToken
}
}
受信した通知を処理するには、UNUserNotificationCenterデリゲートを実装します。willPresentメソッドは、アプリケーションがアクティブなときに通知を受信した場合に呼び出され、カスタムアプリ内通知を表示したり、システムバナーを無視したりできます。didReceiveメソッドは、ユーザーが通知をタップしたときに呼び出され、対応する画面に移動します。DataメッセージにはMessagingDelegateが使用され、バックグラウンドでFCMメッセージを受信したときにペイロードを受け取ります。
サーバー側からのFCMメッセージ送信は、Firebase Cloud MessagingのHTTP v1 APIまたはレガシーFirebase Cloud Messaging APIを通じて実行されます。HTTP v1 APIは推奨される方法であり、Service Accountを介したOAuth 2.0認証を使用し、配信分析や通知のA/Bテストを含むすべての最新FCM機能をサポートしています。リクエストはPOSTメソッドでエンドポイントhttps://fcm.googleapis.com/v1/projects/{project_id}/messages:sendに送信されます。
リクエスト本文には、メッセージ情報を含むJSONオブジェクトが含まれます:target(トークン、トピック、または条件)、notification(表示用)、data(カスタムペイロード)。認証はサーバーの環境変数にロードされたService Account JSONキーを介して行われます。アクセストークンはgoogle-auth-libraryを使用して生成されます。Googleは、認証管理と再試行を自動化するためにFirebase Admin SDKの使用を推奨しています。
const admin = require("firebase-admin")
const serviceAccount = require("./serviceAccountKey.json")
admin.initializeApp({ credential: admin.credential.cert(serviceAccount) })
const message = {
token: "device_registration_token",
notification: { title: "20%割引", body: "本日全サービス対象" },
data: { screen: "promo", promoId: "324" },
android: { priority: "high" },
apns: { payload: { aps: { sound: "default" } } }
}
admin.messaging().send(message)
.then(response => {
console.log("送信成功:", response)
})
.catch(error => {
console.log("送信エラー:", error)
})
ユーザーグループに通知を送信するために、FCMはトピックサブスクリプションをサポートしています。トピックは名前付きチャネルであり、クライアントアプリケーションはFirebaseMessaging.getInstance().subscribeToTopic()を通じてサブスクライブします。サーバーはトピックにメッセージを送信でき、サブスクライブしているすべてのデバイスに配信されます。トピックは、ニュースレター、プロモーション通知、イベントベースのプッシュに適しています。より正確なセグメンテーションには、論理演算子を使用した複数のトピックに基づく条件が使用されます。
よくある質問
FCMはAndroidではGoogle自身のインフラストラクチャを通じて動作し、iOSではトランスポートプロトコルとしてAPNsを使用します。FCMは両方のプラットフォームに統一API、オフラインメッセージの自動保存、配信分析を提供しますが、これらは純粋なAPNsでは利用できません。
はい。Firebase ConsoleのCloud Messagingセクションを通じて、選択したデバイス、トピック、またはオーディエンスセグメントに手動で通知を送信できます。この機能はテストや単発配信に適していますが、本番アプリケーションのサーバー統合を代替するものではありません。
FirebaseMessagingService(Android)のonNewTokenまたはMessagingDelegate(iOS)を介してトークンの更新をサブスクライブします。トークンが変更されたら、新しいトークンをサーバーに送信し、古いトークンを削除します。サーバーはデータベースを更新し、古いトークンへの送信試行を停止する必要があります。
FCMはメッセージを最大28日間キューに保存し、接続が回復したときに配信します。Notificationメッセージの場合、各コラプスグループの最後のメッセージのみがコラプスされます。Dataメッセージは個別に保存され、コラプスなしで送信順に配信されます。
FCMは完全に無料で、メッセージ数に制限はありません。FCMの使用はSparkプランでもBlazeプランでも課金されません。ペイロードサイズにのみ制限があります:notificationメッセージは最大4 KB、dataメッセージは最大2 KBです。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。