プッシュ通知におけるRegistration Token:概要、取得方法、更新方法

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

Registration Tokenは、Firebase Cloud Messaging(FCM)がプッシュ通知を配信するために使用する一意のデバイス識別子です。各デバイスの各アプリは独自のトークンを取得し、これなしでは通知の送信は不可能です。Firebase、2025によると、Registration Tokenはアプリの初回起動時に自動生成され、特定の条件下で変更される可能性があります。

重要ポイント

  • Registration Tokenは、特定のデバイス上のアプリインスタンスをFCMに識別させる文字列です。
  • トークンは初回起動時またはアプリデータ削除後に自動生成されます。
  • FCMはトークンを使用してプッシュ通知を正しいデバイスにルーティングします。
  • トークンは変更される可能性があります — アプリはonNewTokenを介して更新を購読する必要があります。
  • 通知を送信するには、サーバーがすべてのデバイスの現在のトークンを保存する必要があります。

Registration Tokenとは

Registration Tokenは、Firebase Cloud Messagingが各アプリインスタンスに割り当てる最大4096文字の一意の文字列です。トークンは、アプリケーションID、デバイスID、デバイスのGoogleアカウントに基づいて形成されます。

トークンの構造と目的

Registration Tokenは、Base64形式でエンコードされたランダムな文字列で構成されます。FCMはこのトークンを配信アドレスとして使用します — サーバーがトークンに通知を送信すると、FCMが特定のデバイスにルーティングします。トークンがなければ、特定のユーザーにプッシュ通知を送信することは不可能です。

他の識別子との違い

Registration TokenはDevice ID(IMEI)やAdvertising IDと混同しないでください。Device IDはデバイスのハードウェア識別子であり、Advertising IDは広告目的で使用されます。Registration Tokenはアプリとデバイスの組み合わせに紐づいており、1台のデバイスが異なるアプリ用に複数のトークンを持つことができます。

識別子目的変更可能性
Registration TokenFCMプッシュ通知の配信変更される可能性あり
Device ID (IMEI)ハードウェア識別永続的
Advertising IDターゲット広告リセット可能
Instance ID従来のFirebase機構削除時に変更

トークンが無効と見なされる場合

FCMはいくつかの状況でRegistration Tokenを無効と見なすことがあります。アプリがデバイスから削除された場合、トークンは自動的に取り消されます。新しいデバイスでバックアップからデータを復元すると、古いトークンは機能しなくなります。また、古いトークンに通知を送信しようとすると、FirebaseはUNREGISTEREDステータスを返します。

FCMがRegistration Tokenを割り当てる方法

Firebase Cloud Messagingは、アプリが初回起動時にgetToken()メソッドを呼び出すとRegistration Tokenを生成します。このプロセスには、Google Play Servicesの認証情報の確認とFirebaseインフラへのアプリ登録が含まれます。

デバイス登録プロセス

デバイスが統合FCM SDKを備えたアプリを初めて実行すると、以下のことが発生します。Firebase SDKはデバイス上のGoogle Play Servicesの存在を確認します。次にSDKは、アプリケーションIDとデバイス情報を送信してFirebaseサーバーにリクエストを送信します。Firebaseサーバーは新しいトークンを作成し、アプリに返します。

FCMの内部メカニズム

FCMは長期接続に基づくアーキテクチャを使用しています。Registration Tokenを受信した後、デバイスはAndroidではSTOMPプロトコル、iOSではAPNsチャネルを介してFirebaseサーバーとの永続的な接続を確立します。サーバーがトークンに通知を送信すると、FCMはトークンによってデバイスを見つけ、ペイロードを配信します。

トークン再生成の条件

Registration Tokenは以下の場合にFCMによって再生成される可能性があります。新しいデバイスでバックアップからアプリを復元する場合。アプリを削除して再インストールする場合。システム設定からアプリデータを消去する場合。デバイスで異なるGoogleアカウントにサインインする場合。Firebaseは変更を追跡するために常にonNewTokenコールバックを処理することを推奨しています。

AndroidでRegistration Tokenを取得する

Androidでは、Registration TokenはFirebase Messaging SDKを介して取得されます。プロセスはSDKのバージョンによって異なります — 新しいバージョンでは、廃止されたFirebaseInstanceIdの代わりにFirebaseInstallations APIを使用します。

FirebaseInstallationsによる現代的な方法

Firebase SDKバージョン21.0.0以降、getToken()メソッドはFirebaseMessagingを介して呼び出されます。このアプローチはトークンのライフサイクルを自動的に管理し、その更新を購読します。

kotlin
class MyFirebaseMessagingService : FirebaseMessagingService() {

    override fun onNewToken(token: String) {
        sendRegistrationToServer(token)
    }

    private fun sendRegistrationToServer(token: String) {
        // サーバーにトークンを送信
        Log.d("FCM", "New token: $token")
    }

    init {
        FirebaseMessaging.getInstance()
            .getToken()
            .addOnCompleteListener { task ->
                if (!task.isSuccessful) {
                    Log.w("FCM", "FCMトークンの取得に失敗しました")
                    return@addOnCompleteListener
                }
                val token = task.result
                sendRegistrationToServer(token)
            }
    }
}

ActivityまたはViewModelでのトークン処理

一部のシナリオでは、トークンはサービスではなくActivityViewModelで直接必要になります。その場合、アプリのライフサイクルの適切なタイミングでgetToken()を呼び出すことができます。非同期処理を行わずにメインスレッドからこのメソッドを呼び出さないことが重要です。

kotlin
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        getFCMToken()
    }

    private fun getFCMToken() {
        FirebaseMessaging.getInstance().getToken()
            .addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    val token = task.result
                    Log.d("FCM", "Token: $token")
                }
            }
    }
}

従来のFirebaseInstanceIdメソッド

Firebase SDKの古いバージョン(20.x以前)では、トークンはFirebaseInstanceId.getInstance().getToken()を介して取得されていました。このメソッドは非推奨であり、新しいプロジェクトでの使用は推奨されません。レガシーコードを保守する開発者はFirebaseInstallations APIに移行する必要があります。

iOSでRegistration Tokenを取得する

iOSでは、Registration Tokenの取得プロセスがアーキテクチャ的に異なります — FCMはApple Push Notification service(APNs)を介して動作します。Firebase SDKはAPNsから一意のデバイストークンを受信し、FCM形式に変換してアプリに配信します。

APNsの設定とトークンの取得

iOSでFCMを使用するには、FirebaseコンソールでAPNs証明書またはキーを設定する必要があります。アプリはUNUserNotificationCenterを介して通知許可をリクエストする必要があります。APNsトークンを受信した後、Firebase SDKが自動的にRegistration Tokenを生成します。

swift
import FirebaseMessaging
import UserNotifications

class AppDelegate: UIResponder, UIApplicationDelegate {

    func application(
        application: UIApplication,
        didFinishLaunchingWithOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        FirebaseApp.configure()
        Messaging.messaging().delegate = self
        requestNotificationAuthorization()
        return true
    }

    private func requestNotificationAuthorization() {
        let center = UNUserNotificationCenter.current()
        center.requestAuthorization(options: [.alert, .sound, .badge])
    }
}

extension AppDelegate: MessagingDelegate {
    func messaging(
        messaging: Messaging,
        didReceiveRegistrationToken fcmToken: String?
    ) {
        Log.d("FCM", "Token: \(fcmToken ?? "")")
        sendTokenToServer(token: fcmToken)
    }
}

iOSトークンとAndroidトークンの違い

iOSのRegistration Tokenは、APNsデバイストークンに基づいているため、Androidトークンと比較してサイズが小さくなっています。Firebase SDKは、APNsトークンが変更されると自動的にFCMトークンを更新します。これは、デバイスのバックアップからの復元やアプリの再インストール時に発生します。

Registration Tokenの更新と管理

Registration Tokenのライフサイクル管理は、プッシュ通知の確実な配信にとって極めて重要なタスクです。サーバーが古いトークンを保存している場合、通知は配信されず、FirebaseはUNREGISTEREDエラーを返します。

トークン変更の監視

Firebase SDKはトークン変更を追跡するための2つのメカニズムを提供しています。Androidでは、FirebaseMessagingServiceのonNewTokenコールバックが使用されます。iOSでは、messaging:didReceiveRegistrationTokenデリゲートが使用されます。トークンが更新されるたびに両方が呼び出されます。

kotlin
// SharedPreferencesにトークンを保存し、サーバーに送信
class TokenManager(private val context: Context) {

    companion object {
        private const val PREFS_TOKEN_KEY = "fcm_registration_token"
    }

    fun saveToken(token: String) {
        val prefs = PreferenceManager
            .getDefaultSharedPreferences(context)
        prefs.edit().putString(PREFS_TOKEN_KEY, token).apply()
    }

    fun getSavedToken(): String? {
        val prefs = PreferenceManager
            .getDefaultSharedPreferences(context)
        return prefs.getString(PREFS_TOKEN_KEY, null)
    }
}

サーバー側のトークン保存戦略

サーバーはRegistration Tokenをユーザー識別子と関連付けて保存する必要があります。トークンが更新されると、クライアントは新しいトークンをサーバーに送信し、サーバーは古いものを置き換えます。トークン履歴を保持することをお勧めします:新しいトークンに通知が配信されなかった場合、古いものを試すことができます。

トークン操作時のエラー処理

Firebaseはいくつかのケースでトークン取得エラーを返す可能性があります。デバイスにGoogle Play Servicesがない場合 — トークンは取得されません。FCMへのリクエストクォータを超えた場合 — 再試行時に指数バックオフを実装する必要があります。トークンの有効期限切れ — SDKが自動的に新しいものを要求します。

状況結果開発者の対応
アプリの削除トークン無効化データベースからトークンを削除
バックアップからの復元新しいトークンデータベースを更新
Google Play Servicesのリセットトークン再生成onNewTokenを処理
トークンの有効期限自動更新更新を購読

よくある質問

Registration Tokenが受信されない場合はどうすればよいですか?

デバイスにGoogle Play Servicesが存在するか確認し、google-services.jsonファイルの正確性とFirebase SDKのバージョンを確認してください。アプリにインターネット権限があることを確認してください。

Registration Tokenはどのくらいの頻度で変更されますか?

トークンは、アプリのアンインストールと再インストール、データの消去、バックアップからの復元、または異なるGoogleアカウントへのサインイン時に変更される可能性があります。固定された時間間隔はありません。

1台のデバイスで複数のRegistration Tokenを持つことはできますか?

はい、デバイスの各アプリは独自のFCMトークンを取得します。デバイスにFirebaseを使用する3つのアプリがある場合、それぞれが独自の一意のRegistration Tokenを持ちます。

Registration Tokenがまだ有効かどうかを確認するには?

FirebaseコンソールまたはFCM HTTP APIを介してテスト通知を送信してください。トークンが無効な場合、APIはUNREGISTEREDまたはNOT_FOUNDエラーを返します。

サーバーにRegistration Tokenを保存しても安全ですか?

Registration Tokenは秘密鍵ではありませんが、その漏洩によりユーザーのデバイスに通知を送信できるようになります。トークンは安全なデータベースに保存し、送信にはHTTPSを使用してください。

まとめ

  • Registration Tokenは、Firebase Cloud Messagingを介してプッシュ通知を配信するために必須の要素です。
  • トークンはFCM SDKを備えたアプリの初回起動時に自動生成されます。
  • Androidでは、トークンはFirebaseMessaging.getInstance().getToken()を介して取得されます。
  • iOSでは、トークンはAPNsデバイストークンに基づき、MessagingDelegateを介して配信されます。
  • トークンは変更される可能性があるため、アプリはonNewTokenコールバックを処理する必要があります。
  • サーバーは現在のトークンを保存し、UNREGISTEREDエラーが発生した場合に古いものを削除する必要があります。
  • 確実な配信のために、トークン変更の監視と障害時の再試行メカニズムを実装してください。

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

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

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

こちらもお読みください