プッシュ通知におけるトピック購読 — 概要、動作原理、設定方法

著者: IT Sectr 公開日: 2026-03-21 読了時間: 8 分

トピック購読はFirebase Cloud Messagingのメカニズムで、デバイスを興味ごとにグループ化し、購読者のカテゴリ全体に通知を送信できます。何千もの個別のRegistration Tokenに送信する代わりに、トピックに1つのメッセージを送信するだけで十分です。Firebase、2025によると、トピック購読はニュースアプリ、スポーツ中継、マーケティングキャンペーンで大規模な通知配信に使用されています。

重要なポイント

  • トピック購読 — グループ通知を受信するためのデバイスのテーマ別FCMチャンネルへの購読。
  • 1つのデバイスは無制限の数のトピックに購読できます。
  • 購読はクライアントとサーバーの両方からFCM HTTP APIを介して管理されます。
  • 最初の購読時にトピックは自動的に作成されます — 事前設定は不要です。
  • トピックに送信するには、トークンのリストの代わりにトピック名を指定するだけで十分です。

FCMにおけるトピック購読とは

トピック購読は、デバイスが名前付きチャンネル(トピック)に購読し、それらのチャンネルに送信されたメッセージを受信するグループプッシュ通知配信メカニズムです。各トピックは文字列名で識別されます(例:news_sports、weather_alerts)。

トピックの動作原理

デバイスがトピックに購読すると、FCMはそのRegistration Tokenをトピックの受信者リストに追加します。トピックにメッセージが送信されると、FCMは自動的に購読済みの各デバイスにコピーをルーティングします。Firebaseはデバイスあたりの購読数を制限しません — アプリはユーザーを同時に数十のトピックに購読させることができます。

トピックと個別送信の比較

トピックの主な利点はスケーラビリティです。100万人のユーザーに通知を送信するには、トピック名を指定した1つのHTTPリクエストをFCMに送るだけで済みます。個別送信では、100万回のリクエストまたは1回あたり最大500トークンのバッチ送信が必要になります。トピックはサーバー側のロジックも簡素化します — カテゴリごとにトークンリストを保存する必要はありません。

パラメータ個別送信トピック購読
リクエスト数トークンごとに1つ、または最大500のバッチトピックごとに1つ
購読管理サーバー側(トークンリスト)クライアントまたはサーバー
動的グループリストの更新が必要購読により自動
受信者制限1リクエストあたり最大500無制限

トピックの使用例

トピック購読はニュースアプリでコンテンツの分類に広く使用されています — 「スポーツ」「政治」「テクノロジー」のトピックに購読することで、関連する通知を配信できます。Eコマースでは、特定の商品カテゴリの割引に関する通知にトピックが使用されます。メッセンジャーやソーシャルネットワークでは、グループ内のイベントに関する通知にトピックが使用されます。

FCMの制限とクォータ

Firebaseはトピックの操作に制限を課しています。1つのアプリは最大2000トピックまで持つことができます。各デバイスは最大2000トピックまで購読できます。購読/購読解除の頻度も制限されています — プロジェクトあたり毎分最大3000操作。これらの制限を超えると一時的なブロックが発生します。トピック数が多いプロジェクトでは、トピックの代わりに条件(condition)を使用することをお勧めします — FCMはターゲティングのための論理式をサポートしています。

トピック購読の仕組み

トピック購読のプロセスは3つの段階で構成されます:クライアントでの購読の初期化、FCMインフラストラクチャへの登録、操作の確認。購読が成功すると、デバイスはそのトピックに送信されたメッセージの受信を開始します。

購読のライフサイクル

クライアントがsubscribeToTopic()メソッドを呼び出すと、Firebase SDKはFCMサーバーにリクエストを送信します。サーバーは操作の有効性を確認し、デバイストークンをトピックの購読者リストに追加します。FCMは購読成功の確認をクライアントに返します。この時点から、このトピックへのすべてのメッセージがデバイスに配信されます。

トピックの自動作成

Firebaseコンソールで事前にトピックを作成する必要はありません。最初のデバイスがnews_promoという名前のトピックに購読すると、FCMが自動的に作成します。最後のデバイスが購読を解除しても、トピックはシステム内に非アクティブな状態で残り、新しい購読が発生すると再開します。

Androidでのトピック購読

Androidでは、トピックの購読と解除はFirebaseMessaging SDKを介して行われます。subscribeToTopic()メソッドとunsubscribeFromTopic()メソッドはパラメータとしてトピック名を受け取ります。操作は非同期であり、結果の処理が必要です。

基本的なトピック購読

購読するには、対象のトピック名を指定してsubscribeToTopic()を呼び出すだけです。Firebase SDKはネットワークリクエストと障害時の再試行を自動的に管理します。Registration Tokenの取得に成功した後にトピックに購読することをお勧めします。

kotlin
class TopicSubscriber(private val context: Context) {

    fun subscribeToNewsTopic() {
        FirebaseMessaging.getInstance()
            .subscribeToTopic("news_latest")
            .addOnCompleteListener { task ->
                val msg = if (task.isSuccessful) {
                    "Subscribed to news topic"
                } else {
                    "Subscription failed"
                }
                Log.d("FCM", msg)
            }
    }

    fun unsubscribeFromNewsTopic() {
        FirebaseMessaging.getInstance()
            .unsubscribeFromTopic("news_latest")
            .addOnCompleteListener { task ->
                Log.d("FCM", "購読解除: ${task.isSuccessful}")
            }
    }
}

複数購読の管理

実際のアプリでは、ユーザーは複数のカテゴリに購読する場合があります。便利に管理するには、サーバー側と購読状態を同期するマネージャークラスを作成します。ユーザーがログインしたら、プロフィールから購読を復元します。

kotlin
class SubscriptionManager(private val context: Context) {

    private val fcm = FirebaseMessaging.getInstance()

    suspend fun syncSubscriptions(topics: List<String>) {
        topics.forEach { topic ->
            fcm.subscribeToTopic(topic).await()
        }
    }

    suspend fun removeAllSubscriptions() {
        val savedTopics = getSavedTopics()
        savedTopics.forEach { topic ->
            fcm.unsubscribeFromTopic(topic).await()
        }
    }

    private fun getSavedTopics(): List<String> {
        return listOf("news_latest", "promotions", "updates")
    }
}

iOSでのトピック購読

iOSでは、トピック購読のプロセスは論理的にはAndroidと同じですが、Swift Firebase Messaging APIを使用します。subscribeメソッドとunsubscribeメソッドはMessagingインスタンスで呼び出され、これらも非同期です。

iOSでの購読の実装

iOSアプリでトピックに購読するには、Messaging.subscribe()メソッドを使用します。Firebaseの初期化とRegistration Tokenの取得後に購読を呼び出すことが重要です。Appleはトピックに購読する前に通知の許可を求めることを推奨しています。

swift
import FirebaseMessaging

class PushTopicManager {

    func subscribeToTopic(topic: String) {
        Messaging.messaging().subscribe(toTopic: topic) { error in
            if let error = error {
                Log.e("FCM", "購読エラー: \(error)")
            } else {
                Log.d("FCM", "\(topic)に購読しました")
            }
        }
    }

    func unsubscribeFromTopic(topic: String) {
        Messaging.messaging().unsubscribe(fromTopic: topic) { error in
            if let error = error {
                Log.e("FCM", "購読解除エラー: \(error)")
            }
        }
    }
}

iOS購読の特徴

iOSでは、トピック購読はFirebaseがAPNsから受け取るRegistration Tokenにも関連付けられています。APNsトークンが変更された場合(デバイスの復元後など)、Firebaseは自動的に購読を新しいトークンに移行します。ただし、稀なケースでは、Registration Tokenの更新後に再購読が必要になる場合があります。

サーバーからの購読管理

サーバー側の購読管理により、クライアントアプリを介さずにデバイスの購読と解除が可能です。これは管理、A/Bテスト、バックエンドでの購読管理に役立ちます。

購読管理のためのFCM HTTP API

Firebaseは大量購読管理のためのREST APIを提供しています。エンドポイント/v1/projects/{project_id}/subscriptionsは、1つのリクエストで最大1000デバイスまでの購読を許可します。APIは識別のためにデバイスのRegistration Tokenを使用します。

js
const admin = require("firebase-admin")

async function subscribeUsersToTopic(tokens, topic) {
    try {
        const response = await admin
            .messaging()
            .subscribeToTopic(tokens, topic)
        Log.info(`Success: ${response.successCount}`)
        Log.info(`Failures: ${response.failureCount}`)
    } catch (error) {
        Log.error("購読エラー", error)
    }
}

サーバー管理の使用シナリオ

サーバー側の購読管理はいくつかのシナリオで使用されます。ユーザーが登録すると、サーバーは自動的に基本トピックに購読させます。Webバージョンで設定が変更されると、サーバーはモバイルデバイスの購読を同期します。管理者はデバッグ用にテストデバイスを内部トピックに購読させることができます。大量操作には、FCMはInstance Groupメソッドを提供し、単一のグループ識別子を介してデバイスグループの購読を管理できます。

購読状態の監視

Firebaseはデバイスの現在の購読を確認するための組み込みAPIを提供していません。開発者はサーバー側で独自の購読データベースを維持することをお勧めします。アプリ起動のたびに、クライアントはアクティブなトピックのリストを送信してサーバーと購読を同期します。これにより、同期のずれを特定し、必要に応じて購読を復元できます。監査にはFirebase Cloud Functionsのログを使用してください — 各subscribe/unsubscribe操作をログに記録できます。

よくある質問

1つのFirebaseプロジェクトで作成できるトピックの数は?

最大トピック数はアプリあたり2000です。それ以上必要な場合は、デバイスグループまたはトークンによる個別送信を検討してください。

デバイスがどのトピックに購読しているかを確認するには?

Firebaseはデバイスの購読リストを取得するための直接的なAPIを提供していません。開発者は自身のサーバーで購読状態を保存し、クライアントと同期することをお勧めします。

存在しないトピックの購読を解除するとどうなりますか?

FCMは成功結果を返します。Firebaseは存在しないトピックの購読解除をno-op操作として処理します — エラーは発生せず、状態も変更されません。

Firebaseコンソールからトピックに通知を送信できますか?

はい、FirebaseコンソールのCloud Messagingセクションで、トピックをターゲットオーディエンスとして選択し、Webインターフェースからテストまたは本番通知を送信できます。

トピック購読はどれくらい早く有効になりますか?

通常、購読は数秒で有効になります。ただし、稀なケースでは、FCMサーバー間の伝播により30〜60秒の遅延が発生する場合があります。

まとめ

  • トピック購読はFirebase Cloud Messagingを介したグループプッシュ通知配信のメカニズムです。
  • 購読はクライアントからsubscribeToTopic()(Android)またはsubscribe()(iOS)メソッドを使用して実行されます。
  • 1つのデバイスは同時に最大2000トピックまで購読できます。
  • サーバーAPIは1つのリクエストで最大1000デバイスの購読管理を可能にします。
  • トピックは最初の購読時に自動的に作成され、事前設定は不要です。
  • 大規模なオーディエンスを扱う場合、トピック購読は個別送信よりも推奨されます。
  • 重要な通知については、配信を保証するためにトピックと個別送信を組み合わせてください。

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

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

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

こちらもお読みください