Registration Token — уникальный идентификатор устройства, который Firebase Cloud Messaging (FCM) использует для доставки push-уведомлений. Каждое приложение на каждом устройстве получает собственный токен, без которого отправка уведомлений невозможна. По данным Firebase, 2025, Registration Token автоматически генерируется при первом запуске приложения и может изменяться при определённых условиях.
Главное
Registration Token — это уникальная строка длиной до 4096 символов, которую Firebase Cloud Messaging назначает каждому экземпляру приложения. Токен формируется на основе идентификатора приложения, устройства и учётной записи Google на устройстве.
Registration Token состоит из случайной последовательности символов, закодированных в формате Base64. FCM использует этот токен как адрес доставки — серверная часть отправляет уведомление на токен, а FCM маршрутизирует его на конкретное устройство. Без токена невозможно адресовать push-уведомление конкретному пользователю.
Registration Token не следует путать с Device ID (IMEI) или Advertising ID. Device ID — это аппаратный идентификатор устройства, а Advertising ID используется для рекламных целей. Registration Token привязан именно к комбинации приложения и устройства, причём одно устройство может иметь несколько токенов для разных приложений.
| Идентификатор | Назначение | Изменяемость |
|---|---|---|
| Registration Token | Доставка push-уведомлений FCM | Может изменяться |
| Device ID (IMEI) | Идентификация аппарата | Постоянный |
| Advertising ID | Таргетированная реклама | Может быть сброшен |
| Instance ID | Устаревший механизм Firebase | Изменялся при удалении |
FCM может признать Registration Token недействительным в нескольких ситуациях. Если приложение удалено с устройства, токен автоматически аннулируется. При восстановлении данных из резервной копии на новом устройстве старый токен перестаёт работать. Также Firebase UNREGISTERED статус возвращается при попытке отправить уведомление на устаревший токен.
Firebase Cloud Messaging генерирует Registration Token при первом запуске приложения, когда вызывается метод getToken(). Процесс включает проверку учётных данных Google Play Services и регистрацию приложения в инфраструктуре Firebase.
Когда устройство впервые запускает приложение с интегрированным FCM SDK, происходит следующее. Firebase SDK проверяет наличие Google Play Services на устройстве. Затем SDK отправляет запрос на серверы Firebase, передавая идентификатор приложения и информацию об устройстве. Сервер Firebase создаёт новый токен и возвращает его приложению.
FCM использует архитектуру, основанную на долгоживущих соединениях. После получения Registration Token устройство устанавливает постоянное соединение с серверами Firebase через STOMP-протокол на Android или APNs-канал на iOS. Когда серверная часть отправляет уведомление на токен, FCM находит устройство по токену и передаёт полезную нагрузку.
Registration Token может быть перегенерирован FCM в следующих случаях. При восстановлении приложения из резервной копии на новом устройстве. При удалении и повторной установке приложения. При очистке данных приложения через системные настройки. При входе в другую учётную запись Google на устройстве. Firebase рекомендует всегда обрабатывать колбэк onNewToken для отслеживания изменений.
На Android Registration Token получается через Firebase Messaging SDK. Процесс отличается для разных версий SDK — в новых версиях используется FirebaseInstallations API вместо устаревшего FirebaseInstanceId.
Начиная с 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", "Fetching FCM token failed")
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(). Этот метод помечен как deprecated и не рекомендуется к использованию в новых проектах. Разработчикам, поддерживающим legacy-код, следует мигрировать на FirebaseInstallations API.
На iOS процесс получения Registration Token отличается архитектурно — FCM работает через Apple Push Notification service (APNs). Firebase SDK получает от APNs уникальный device token, конвертирует его в формат FCM и передаёт приложению.
Для работы FCM на iOS необходимо настроить APNs-сертификат или ключ в консоли Firebase. Приложение должно запросить разрешение на уведомления через 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)
}
}
Registration Token на iOS имеет меньший размер по сравнению с Android-токеном, поскольку базируется на APNs device token. Firebase SDK автоматически обновляет FCM-токен при изменении APNs-токена, что происходит при восстановлении устройства из резервной копии или переустановке приложения.
Управление жизненным циклом Registration Token — критически важная задача для стабильной доставки push-уведомлений. Если серверная часть хранит устаревший токен, уведомления не будут доставлены, а Firebase вернёт ошибку UNREGISTERED.
Firebase SDK предоставляет два механизма для отслеживания изменений токена. На Android используется колбэк onNewToken в FirebaseMessagingService. На 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, каждое будет иметь свой уникальный Registration Token.
Отправьте тестовое уведомление через консоль Firebase или FCM HTTP API. Если токен недействителен, API вернёт ошибку UNREGISTERED или NOT_FOUND.
Registration Token не является секретным ключом, но его утечка позволяет отправлять уведомления на устройство пользователя. Храните токены в защищённой базе данных и используйте HTTPS для передачи.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также