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 препоръчва винаги да обработвате callback 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", "Получаването на 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(). Този метод е маркиран като 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 се използва callback 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също