トピック購読はFirebase Cloud Messagingのメカニズムで、デバイスを興味ごとにグループ化し、購読者のカテゴリ全体に通知を送信できます。何千もの個別のRegistration Tokenに送信する代わりに、トピックに1つのメッセージを送信するだけで十分です。Firebase、2025によると、トピック購読はニュースアプリ、スポーツ中継、マーケティングキャンペーンで大規模な通知配信に使用されています。
重要なポイント
トピック購読は、デバイスが名前付きチャンネル(トピック)に購読し、それらのチャンネルに送信されたメッセージを受信するグループプッシュ通知配信メカニズムです。各トピックは文字列名で識別されます(例:news_sports、weather_alerts)。
デバイスがトピックに購読すると、FCMはそのRegistration Tokenをトピックの受信者リストに追加します。トピックにメッセージが送信されると、FCMは自動的に購読済みの各デバイスにコピーをルーティングします。Firebaseはデバイスあたりの購読数を制限しません — アプリはユーザーを同時に数十のトピックに購読させることができます。
トピックの主な利点はスケーラビリティです。100万人のユーザーに通知を送信するには、トピック名を指定した1つのHTTPリクエストをFCMに送るだけで済みます。個別送信では、100万回のリクエストまたは1回あたり最大500トークンのバッチ送信が必要になります。トピックはサーバー側のロジックも簡素化します — カテゴリごとにトークンリストを保存する必要はありません。
| パラメータ | 個別送信 | トピック購読 |
|---|---|---|
| リクエスト数 | トークンごとに1つ、または最大500のバッチ | トピックごとに1つ |
| 購読管理 | サーバー側(トークンリスト) | クライアントまたはサーバー |
| 動的グループ | リストの更新が必要 | 購読により自動 |
| 受信者制限 | 1リクエストあたり最大500 | 無制限 |
トピック購読はニュースアプリでコンテンツの分類に広く使用されています — 「スポーツ」「政治」「テクノロジー」のトピックに購読することで、関連する通知を配信できます。Eコマースでは、特定の商品カテゴリの割引に関する通知にトピックが使用されます。メッセンジャーやソーシャルネットワークでは、グループ内のイベントに関する通知にトピックが使用されます。
Firebaseはトピックの操作に制限を課しています。1つのアプリは最大2000トピックまで持つことができます。各デバイスは最大2000トピックまで購読できます。購読/購読解除の頻度も制限されています — プロジェクトあたり毎分最大3000操作。これらの制限を超えると一時的なブロックが発生します。トピック数が多いプロジェクトでは、トピックの代わりに条件(condition)を使用することをお勧めします — FCMはターゲティングのための論理式をサポートしています。
トピック購読のプロセスは3つの段階で構成されます:クライアントでの購読の初期化、FCMインフラストラクチャへの登録、操作の確認。購読が成功すると、デバイスはそのトピックに送信されたメッセージの受信を開始します。
クライアントがsubscribeToTopic()メソッドを呼び出すと、Firebase SDKはFCMサーバーにリクエストを送信します。サーバーは操作の有効性を確認し、デバイストークンをトピックの購読者リストに追加します。FCMは購読成功の確認をクライアントに返します。この時点から、このトピックへのすべてのメッセージがデバイスに配信されます。
Firebaseコンソールで事前にトピックを作成する必要はありません。最初のデバイスがnews_promoという名前のトピックに購読すると、FCMが自動的に作成します。最後のデバイスが購読を解除しても、トピックはシステム内に非アクティブな状態で残り、新しい購読が発生すると再開します。
Androidでは、トピックの購読と解除はFirebaseMessaging SDKを介して行われます。subscribeToTopic()メソッドとunsubscribeFromTopic()メソッドはパラメータとしてトピック名を受け取ります。操作は非同期であり、結果の処理が必要です。
購読するには、対象のトピック名を指定してsubscribeToTopic()を呼び出すだけです。Firebase SDKはネットワークリクエストと障害時の再試行を自動的に管理します。Registration Tokenの取得に成功した後にトピックに購読することをお勧めします。
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}")
}
}
}
実際のアプリでは、ユーザーは複数のカテゴリに購読する場合があります。便利に管理するには、サーバー側と購読状態を同期するマネージャークラスを作成します。ユーザーがログインしたら、プロフィールから購読を復元します。
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では、トピック購読のプロセスは論理的にはAndroidと同じですが、Swift Firebase Messaging APIを使用します。subscribeメソッドとunsubscribeメソッドはMessagingインスタンスで呼び出され、これらも非同期です。
iOSアプリでトピックに購読するには、Messaging.subscribe()メソッドを使用します。Firebaseの初期化とRegistration Tokenの取得後に購読を呼び出すことが重要です。Appleはトピックに購読する前に通知の許可を求めることを推奨しています。
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では、トピック購読はFirebaseがAPNsから受け取るRegistration Tokenにも関連付けられています。APNsトークンが変更された場合(デバイスの復元後など)、Firebaseは自動的に購読を新しいトークンに移行します。ただし、稀なケースでは、Registration Tokenの更新後に再購読が必要になる場合があります。
サーバー側の購読管理により、クライアントアプリを介さずにデバイスの購読と解除が可能です。これは管理、A/Bテスト、バックエンドでの購読管理に役立ちます。
Firebaseは大量購読管理のためのREST APIを提供しています。エンドポイント/v1/projects/{project_id}/subscriptionsは、1つのリクエストで最大1000デバイスまでの購読を許可します。APIは識別のためにデバイスのRegistration Tokenを使用します。
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操作をログに記録できます。
よくある質問
最大トピック数はアプリあたり2000です。それ以上必要な場合は、デバイスグループまたはトークンによる個別送信を検討してください。
Firebaseはデバイスの購読リストを取得するための直接的なAPIを提供していません。開発者は自身のサーバーで購読状態を保存し、クライアントと同期することをお勧めします。
FCMは成功結果を返します。Firebaseは存在しないトピックの購読解除をno-op操作として処理します — エラーは発生せず、状態も変更されません。
はい、FirebaseコンソールのCloud Messagingセクションで、トピックをターゲットオーディエンスとして選択し、Webインターフェースからテストまたは本番通知を送信できます。
通常、購読は数秒で有効になります。ただし、稀なケースでは、FCMサーバー間の伝播により30〜60秒の遅延が発生する場合があります。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。