Firebase Cloud Messagingとは:基本概念、仕組み、プッシュ通知

著者: IT Sectr 公開日: 2026-04-29 読了時間: 9 分

Firebase Cloud Messaging(FCM)は、モバイルおよびウェブアプリケーション向けに設計された、Googleによるクロスプラットフォームのプッシュ通知およびメッセージ配信サービスです。FCMは、永続的なネットワーク接続を維持する必要なく、サーバーとクライアントデバイス間の信頼性の高いデータ転送を保証します。Firebase Documentation、2026によると、FCMインフラストラクチャを通じて世界中で毎日3,000億以上のメッセージが処理されています。このサービスは、自動表示される通知と、バックグラウンドでのデータ転送用のdataメッセージの両方をサポートしています。

重要なポイント

  • FCM — 統一APIとFirebase Consoleを通じてAndroid、iOS、WebをサポートするGoogleの無料プッシュ通知サービスです。
  • メッセージタイプ — notificationメッセージはシステムによって自動表示され、dataメッセージは任意のJSONを送信してアプリケーション内で処理できます。
  • デバイストークン — 各アプリケーションは一意のRegistration Tokenを受け取り、サーバーはこれを使用してターゲットを絞ったプッシュ通知を送信します。
  • 配信優先度 — normal優先度とhigh優先度は、省電力時のシステム動作を決定します。highメッセージはDozeモードからデバイスを起動します。
  • トピックとグループ — FCMは、一斉配信用のトピックサブスクリプションと、1人のユーザーの複数デバイスへの送信用のDevice Groupsをサポートしています。

Firebase Cloud Messagingとは

Firebase Cloud Messagingは、アプリケーションサーバーとクライアントデバイス間でプッシュ通知とdataメッセージの配信を保証するGoogleのクラウドサービスです。このサービスは従来のGoogle Cloud Messaging(GCM)を置き換え、Firebaseエコシステムにおけるプッシュ配信の標準ソリューションになりました。FCMはAndroid、iOS、Web、Unityをサポートし、ターゲットプラットフォームに関係なく統一された送信インターフェースを提供します。

FCMの主な機能

このサービスは、メッセージ配信のための複数のメカニズムを提供し、それぞれが特定のタスクを解決します。Notificationメッセージは受信時にシステムによって自動表示されるため、開発者が通知を表示するコードを書く必要はありません。Dataメッセージはキーと値のペアとして任意のペイロードを転送し、アプリケーション内で処理されます。複合メッセージには、最大の柔軟性を得るために可視部分と非表示部分の両方が含まれています。

独自ソリューションに対する利点

独自のプッシュサーバーを実装するには、各デバイスとの永続的なTCP接続を維持する必要があり、非効率的で安全ではありません。FCMはGoogleの統一インフラストラクチャを使用し、同時に何十億ものデバイスとの接続を維持します。このサービスは、配信再試行、メッセージキュー、負荷分散を自動的に管理し、開発者がこれらのタスクを自分で解決する必要をなくします。

Firebase Cloud Messagingの仕組み

FCMのアーキテクチャは、プロバイダーサーバー(バックエンド)、Firebase Cloud Messagingサーバー、デバイス上のクライアントアプリケーションの3つの主要コンポーネントで構成されています。サーバーがメッセージを送信すると、最初にFCMインフラストラクチャに到達し、FCMがターゲットデバイスにルーティングします。デバイスがオフラインの場合、FCMはメッセージをキューに保存し、接続が回復したときに配信します。

デバイス登録とトークン取得

初回起動時に、アプリケーションはFirebase SDKを呼び出し、FCMサービスにデバイスを登録して一意のRegistration Tokenを受け取ります。このトークンは約150文字の文字列で、特定のデバイス上の特定のアプリケーションインスタンスを識別します。トークンは、アプリケーションの再インストール、データの消去、またはバックアップからの復元時に変更される可能性があるため、開発者はonNewTokenデリゲートを通じてトークンの更新を処理する必要があります。

メッセージのライフサイクル

サーバーがFCM APIを通じてリクエストを送信すると、メッセージはいくつかの段階を経ます。受信と検証 — FCMはリクエストの妥当性とターゲットデバイスの存在を確認します。キュー — デバイスが利用不可の場合、メッセージはストレージキューに入ります。ルーティング — FCMが最適な配信チャネル(WiFiまたはモバイルデータ)を決定します。配信 — システムがターゲットアプリケーションにメッセージを送信します。配信成功後、FCMはサーバーにメッセージIDを返します。

FCMのメッセージタイプ

Firebase Cloud Messagingは3つのメッセージタイプをサポートしており、それぞれクライアント側で独自の処理特性を持っています。NotificationメッセージはAndroidではGoogle Play Services、iOSではAPNsによって処理され、自動的にプッシュバナーとして表示されます。Dataメッセージはアプリケーションに直接配信され、AndroidではonMessageReceivedコールバック、iOSではapplication(_:didReceiveRemoteNotification:)を通じて処理されます。

Notificationメッセージ

Notificationメッセージには、title、body、画像URL、通知音などの定義済みフィールドが含まれています。システムが自動的に通知を作成してシステムトレイに表示します。アプリケーションがバックグラウンドにあるか終了している場合でも同様です。ユーザーはタイトルとテキストの標準バナーを表示し、タップするとペイロードで送信されたデータとともにアプリケーションが開きます。アプリケーションがアクティブな場合、notificationメッセージをインターセプトしてコードで処理できます。

Dataメッセージ

Dataメッセージは、定義済みフィールドのないキーと値のペアのカスタムセットです。ペイロードはシステムによって自動的に処理されず、アプリケーションが生データを受け取り、任意に解釈できます。Dataメッセージは、バックグラウンドでのデータ同期、ローカルキャッシュの更新、同期トリガー、または通知を表示せずにコマンドを送信するために使用されます。Androidでは、アプリケーションが終了しているかバックグラウンドにある場合でも、dataメッセージは常に配信されます。

複合メッセージ

FCMでは、通知部分(表示用)とデータ部分(処理用)の両方を含むメッセージを送信できます。複合ペイロードには、定義済みのnotificationフィールドと任意のdataキーの両方が含まれます。システムはnotification部分から通知を表示し、data部分は開いたときにアプリケーションのインテントエクストラに渡されます。これは、ユーザーに通知を表示すると同時に、特定の画面に移動するためのコンテキストを渡す必要があるシナリオに便利です。

タイプ自動表示バックグラウンド処理
Notificationはい、システムによる自動、コード不要ウェルカムプッシュ通知
Dataいいえアプリケーションコールバック経由バックグラウンドデータ同期
複合はい、notification部分開封時にdata部分通知+注文リンク

AndroidでのFCMセットアップ

AndroidへのFCM統合は、アプリケーションレベルでbuild.gradleファイルを通じてFirebase SDKを接続することから始まります。依存関係とgoogle-services.jsonファイルを追加した後、アプリケーションは自動的にRegistration Tokenを受け取り、FirebaseMessagingServiceコールバックを通じて渡されます。通知を受信するには、FirebaseMessagingServiceを拡張するサービスを作成し、AndroidManifest.xmlに登録する必要があります。

初期化とトークン取得

Firebase SDKを接続した後、デバイストークンは追加コードなしで自動的に生成されます。トークンはFirebaseMessaging.getInstance().tokenを通じて利用可能で、Task<String>を返します。トークンの更新を追跡するには、サービス内でonNewTokenメソッドをオーバーライドします。サーバーがこのデバイスにプッシュ通知を送信できるように、トークンをプロバイダーサーバーに送信する必要があります。

kotlin
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が必要です。

xml
<!-- 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セットアップ

iOSへのFCM統合には、Apple Push Notification Service(APNs)側とFirebase Consoleの両方での設定が必要です。FCMが直接接続を管理するAndroidとは異なり、iOSではFCMはトランスポート層としてAPNsを使用します。アプリケーションはUIApplication.shared.registerForRemoteNotificationsを通じてプッシュ通知に登録し、Firebase SDKが受信したデバイストークンをインターセプトしてFCM Registration Tokenにリンクします。

APNsの設定と通知登録

iOSでFCMを機能させるには、Firebase ConsoleにAPNsキーまたは証明書をアップロードする必要があります。APNsキーは、証明書なしの最新の認証方法であり(Apple推奨)、Apple Developer PortalのKeysセクションで作成され、Firebase ConsoleのCloud Messaging設定にアップロードされます。APNs設定後、アプリケーションはUNUserNotificationCenterを通じて通知許可を要求し、APNs経由で登録します。

swift
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に送信されます。

HTTP v1リクエスト形式

リクエスト本文には、メッセージ情報を含むJSONオブジェクトが含まれます:target(トークン、トピック、または条件)、notification(表示用)、data(カスタムペイロード)。認証はサーバーの環境変数にロードされたService Account JSONキーを介して行われます。アクセストークンはgoogle-auth-libraryを使用して生成されます。Googleは、認証管理と再試行を自動化するためにFirebase Admin SDKの使用を推奨しています。

js
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とAPNsの違いは何ですか?

FCMはAndroidではGoogle自身のインフラストラクチャを通じて動作し、iOSではトランスポートプロトコルとしてAPNsを使用します。FCMは両方のプラットフォームに統一API、オフラインメッセージの自動保存、配信分析を提供しますが、これらは純粋なAPNsでは利用できません。

サーバーなしでFCMメッセージを送信できますか?

はい。Firebase ConsoleのCloud Messagingセクションを通じて、選択したデバイス、トピック、またはオーディエンスセグメントに手動で通知を送信できます。この機能はテストや単発配信に適していますが、本番アプリケーションのサーバー統合を代替するものではありません。

デバイストークンが変更された場合はどうすればよいですか?

FirebaseMessagingService(Android)のonNewTokenまたはMessagingDelegate(iOS)を介してトークンの更新をサブスクライブします。トークンが変更されたら、新しいトークンをサーバーに送信し、古いトークンを削除します。サーバーはデータベースを更新し、古いトークンへの送信試行を停止する必要があります。

FCMはオフラインデバイスをどのように処理しますか?

FCMはメッセージを最大28日間キューに保存し、接続が回復したときに配信します。Notificationメッセージの場合、各コラプスグループの最後のメッセージのみがコラプスされます。Dataメッセージは個別に保存され、コラプスなしで送信順に配信されます。

Firebase Cloud Messagingの使用料金はいくらですか?

FCMは完全に無料で、メッセージ数に制限はありません。FCMの使用はSparkプランでもBlazeプランでも課金されません。ペイロードサイズにのみ制限があります:notificationメッセージは最大4 KB、dataメッセージは最大2 KBです。

まとめ

  • Firebase Cloud Messagingは、統一APIを通じてAndroid、iOS、Web、UnityをサポートするGoogleのクロスプラットフォームプッシュ通知サービスです。
  • FCMのアーキテクチャは、プロバイダーサーバー、Firebaseインフラストラクチャ、クライアントアプリケーションで構成され、Googleのグローバルネットワークを通じて信頼性の高いメッセージ配信を保証します。
  • 3つのメッセージタイプ — notification(自動表示)、data(UIなしの任意ペイロード)、複合(1つのメッセージに両方のタイプ)。
  • AndroidのFCMは独自の接続を持つFirebaseMessagingServiceを通じて動作し、iOSではMessagingDelegateを介したトークンインターセプトとともにAPNsをトランスポートとして使用します。
  • HTTP v1 APIは、Service Accountを介したOAuth 2.0認証と配信分析サポートを備えたサーバー側送信に推奨されます。
  • トピックによりサブスクライバーグループへのメッセージ送信が可能になり、条件により正確なセグメンテーションのために複数のトピックを組み合わせることができます。
  • FCMは無料でメッセージ制限がなく、オフラインメッセージを最大28日間保存し、最大ペイロードサイズは4 KBです。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください