Registration Tokenは、Firebase Cloud Messaging(FCM)がプッシュ通知を配信するために使用する一意のデバイス識別子です。各デバイスの各アプリは独自のトークンを取得し、これなしでは通知の送信は不可能です。Firebase、2025によると、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 Token | FCMプッシュ通知の配信 | 変更される可能性あり |
| Device ID (IMEI) | ハードウェア識別 | 永続的 |
| Advertising ID | ターゲット広告 | リセット可能 |
| Instance ID | 従来のFirebase機構 | 削除時に変更 |
FCMはいくつかの状況でRegistration Tokenを無効と見なすことがあります。アプリがデバイスから削除された場合、トークンは自動的に取り消されます。新しいデバイスでバックアップからデータを復元すると、古いトークンは機能しなくなります。また、古いトークンに通知を送信しようとすると、FirebaseはUNREGISTEREDステータスを返します。
Firebase Cloud Messagingは、アプリが初回起動時にgetToken()メソッドを呼び出すとRegistration Tokenを生成します。このプロセスには、Google Play Servicesの認証情報の確認とFirebaseインフラへのアプリ登録が含まれます。
デバイスが統合FCM SDKを備えたアプリを初めて実行すると、以下のことが発生します。Firebase SDKはデバイス上のGoogle Play Servicesの存在を確認します。次にSDKは、アプリケーションIDとデバイス情報を送信してFirebaseサーバーにリクエストを送信します。Firebaseサーバーは新しいトークンを作成し、アプリに返します。
FCMは長期接続に基づくアーキテクチャを使用しています。Registration Tokenを受信した後、デバイスはAndroidではSTOMPプロトコル、iOSではAPNsチャネルを介してFirebaseサーバーとの永続的な接続を確立します。サーバーがトークンに通知を送信すると、FCMはトークンによってデバイスを見つけ、ペイロードを配信します。
Registration Tokenは以下の場合にFCMによって再生成される可能性があります。新しいデバイスでバックアップからアプリを復元する場合。アプリを削除して再インストールする場合。システム設定からアプリデータを消去する場合。デバイスで異なるGoogleアカウントにサインインする場合。Firebaseは変更を追跡するために常にonNewTokenコールバックを処理することを推奨しています。
Androidでは、Registration TokenはFirebase Messaging SDKを介して取得されます。プロセスはSDKのバージョンによって異なります — 新しいバージョンでは、廃止されたFirebaseInstanceIdの代わりにFirebaseInstallations APIを使用します。
Firebase SDKバージョン21.0.0以降、getToken()メソッドはFirebaseMessagingを介して呼び出されます。このアプローチはトークンのライフサイクルを自動的に管理し、その更新を購読します。
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で直接必要になります。その場合、アプリのライフサイクルの適切なタイミングでgetToken()を呼び出すことができます。非同期処理を行わずにメインスレッドからこのメソッドを呼び出さないことが重要です。
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")
}
}
}
}
Firebase SDKの古いバージョン(20.x以前)では、トークンはFirebaseInstanceId.getInstance().getToken()を介して取得されていました。このメソッドは非推奨であり、新しいプロジェクトでの使用は推奨されません。レガシーコードを保守する開発者はFirebaseInstallations APIに移行する必要があります。
iOSでは、Registration Tokenの取得プロセスがアーキテクチャ的に異なります — FCMはApple Push Notification service(APNs)を介して動作します。Firebase SDKはAPNsから一意のデバイストークンを受信し、FCM形式に変換してアプリに配信します。
iOSでFCMを使用するには、FirebaseコンソールでAPNs証明書またはキーを設定する必要があります。アプリはUNUserNotificationCenterを介して通知許可をリクエストする必要があります。APNsトークンを受信した後、Firebase SDKが自動的にRegistration Tokenを生成します。
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のRegistration Tokenは、APNsデバイストークンに基づいているため、Androidトークンと比較してサイズが小さくなっています。Firebase SDKは、APNsトークンが変更されると自動的にFCMトークンを更新します。これは、デバイスのバックアップからの復元やアプリの再インストール時に発生します。
Registration Tokenのライフサイクル管理は、プッシュ通知の確実な配信にとって極めて重要なタスクです。サーバーが古いトークンを保存している場合、通知は配信されず、FirebaseはUNREGISTEREDエラーを返します。
Firebase SDKはトークン変更を追跡するための2つのメカニズムを提供しています。Androidでは、FirebaseMessagingServiceのonNewTokenコールバックが使用されます。iOSでは、messaging:didReceiveRegistrationTokenデリゲートが使用されます。トークンが更新されるたびに両方が呼び出されます。
// 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を処理 |
| トークンの有効期限 | 自動更新 | 更新を購読 |
よくある質問
デバイスにGoogle Play Servicesが存在するか確認し、google-services.jsonファイルの正確性とFirebase SDKのバージョンを確認してください。アプリにインターネット権限があることを確認してください。
トークンは、アプリのアンインストールと再インストール、データの消去、バックアップからの復元、または異なるGoogleアカウントへのサインイン時に変更される可能性があります。固定された時間間隔はありません。
はい、デバイスの各アプリは独自のFCMトークンを取得します。デバイスにFirebaseを使用する3つのアプリがある場合、それぞれが独自の一意のRegistration Tokenを持ちます。
FirebaseコンソールまたはFCM HTTP APIを介してテスト通知を送信してください。トークンが無効な場合、APIはUNREGISTEREDまたはNOT_FOUNDエラーを返します。
Registration Tokenは秘密鍵ではありませんが、その漏洩によりユーザーのデバイスに通知を送信できるようになります。トークンは安全なデータベースに保存し、送信にはHTTPSを使用してください。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。