Registration Token è un identificatore univoco del dispositivo che Firebase Cloud Messaging (FCM) utilizza per consegnare le notifiche push. Ogni applicazione su ogni dispositivo riceve il proprio token, senza il quale l'invio di notifiche è impossibile. Secondo Firebase, 2025, il Registration Token viene generato automaticamente al primo avvio dell'applicazione e può cambiare in determinate condizioni.
Punti chiave
Registration Token è una stringa univoca lunga fino a 4096 caratteri che Firebase Cloud Messaging assegna a ogni istanza dell'applicazione. Il token è formato in base all'ID dell'applicazione, all'ID del dispositivo e all'account Google sul dispositivo.
Un Registration Token consiste in una sequenza casuale di caratteri codificati in formato Base64. FCM utilizza questo token come indirizzo di consegna — il server invia una notifica al token e FCM la instrada al dispositivo specifico. Senza un token, è impossibile indirizzare una notifica push a un utente specifico.
Un Registration Token non va confuso con il Device ID (IMEI) o l'Advertising ID. Il Device ID è un identificatore hardware del dispositivo, mentre l'Advertising ID viene utilizzato per scopi pubblicitari. Il Registration Token è legato alla combinazione di applicazione e dispositivo, e un singolo dispositivo può avere più token per diverse applicazioni.
| Identificatore | Scopo | Modificabilità |
|---|---|---|
| Registration Token | Consegna notifiche push FCM | Può cambiare |
| Device ID (IMEI) | Identificazione hardware | Permanente |
| Advertising ID | Pubblicità mirata | Può essere reimpostato |
| Instance ID | Meccanismo Firebase legacy | Cambiava alla cancellazione |
FCM può considerare un Registration Token non valido in diverse situazioni. Se l'applicazione viene rimossa dal dispositivo, il token viene automaticamente revocato. Quando si ripristinano i dati da un backup su un nuovo dispositivo, il vecchio token smette di funzionare. Firebase restituisce anche uno stato UNREGISTERED quando si tenta di inviare una notifica a un token obsoleto.
Firebase Cloud Messaging genera un Registration Token quando l'applicazione viene avviata per la prima volta e viene chiamato il metodo getToken(). Il processo include la verifica delle credenziali di Google Play Services e la registrazione dell'applicazione nell'infrastruttura Firebase.
Quando un dispositivo esegue per la prima volta un'applicazione con FCM SDK integrato, accade quanto segue. Firebase SDK verifica la presenza di Google Play Services sul dispositivo. Quindi, SDK invia una richiesta ai server Firebase, trasmettendo l'ID dell'applicazione e le informazioni del dispositivo. Il server Firebase crea un nuovo token e lo restituisce all'applicazione.
FCM utilizza un'architettura basata su connessioni a lunga durata. Dopo aver ricevuto un Registration Token, il dispositivo stabilisce una connessione persistente con i server Firebase tramite il protocollo STOMP su Android o il canale APNs su iOS. Quando il server invia una notifica al token, FCM trova il dispositivo tramite il token e consegna il payload.
Un Registration Token può essere rigenerato da FCM nei seguenti casi. Quando si ripristina un'applicazione da un backup su un nuovo dispositivo. Quando si elimina e re-installa l'applicazione. Quando si cancellano i dati dell'applicazione tramite le impostazioni di sistema. Quando si accede con un account Google diverso sul dispositivo. Firebase raccomanda di gestire sempre il callback onNewToken per tracciare le modifiche.
Su Android, il Registration Token si ottiene tramite Firebase Messaging SDK. Il processo differisce a seconda della versione dell'SDK — le versioni più recenti utilizzano l'API FirebaseInstallations invece del deprecato FirebaseInstanceId.
A partire dalla versione 21.0.0 di Firebase SDK, il metodo getToken() viene chiamato tramite FirebaseMessaging. Questo approccio gestisce automaticamente il ciclo di vita del token e si iscrive ai suoi aggiornamenti.
class MyFirebaseMessagingService : FirebaseMessagingService() {
override fun onNewToken(token: String) {
sendRegistrationToServer(token)
}
private fun sendRegistrationToServer(token: String) {
// Invio del token al server
Log.d("FCM", "New token: $token")
}
init {
FirebaseMessaging.getInstance()
.getToken()
.addOnCompleteListener { task ->
if (!task.isSuccessful) {
Log.w("FCM", "Recupero del token FCM fallito")
return@addOnCompleteListener
}
val token = task.result
sendRegistrationToServer(token)
}
}
}
In alcuni scenari, il token è necessario non nel servizio ma direttamente in un'Activity o ViewModel. Per questo, getToken() può essere chiamato in un punto conveniente del ciclo di vita dell'applicazione. È importante non chiamare questo metodo dal thread principale senza gestire l'asincronia.
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")
}
}
}
}
Nelle versioni precedenti di Firebase SDK (prima della 20.x), il token veniva ottenuto tramite FirebaseInstanceId.getInstance().getToken(). Questo metodo è contrassegnato come deprecato e non è raccomandato per l'uso in nuovi progetti. Gli sviluppatori che mantengono codice legacy dovrebbero migrare all'API FirebaseInstallations.
Su iOS, il processo di ottenimento del Registration Token differisce architetturalmente — FCM funziona tramite Apple Push Notification service (APNs). Firebase SDK riceve un token dispositivo univoco da APNs, lo converte in formato FCM e lo passa all'applicazione.
Per utilizzare FCM su iOS, è necessario configurare un certificato o una chiave APNs nella console Firebase. L'applicazione deve richiedere il permesso per le notifiche tramite UNUserNotificationCenter. Dopo aver ricevuto il token APNs, Firebase SDK genera automaticamente il 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)
}
}
Il Registration Token su iOS ha dimensioni inferiori rispetto al token Android, poiché si basa sul token dispositivo APNs. Firebase SDK aggiorna automaticamente il token FCM quando cambia il token APNs, cosa che accade quando si ripristina un dispositivo da un backup o si re-installa l'applicazione.
La gestione del ciclo di vita del Registration Token è un compito critico per la consegna affidabile delle notifiche push. Se il server memorizza un token obsoleto, le notifiche non verranno consegnate e Firebase restituirà un errore UNREGISTERED.
Firebase SDK fornisce due meccanismi per tracciare le modifiche del token. Su Android, viene utilizzato il callback onNewToken in FirebaseMessagingService. Su iOS, viene utilizzato il delegato messaging:didReceiveRegistrationToken. Entrambi vengono chiamati ogni volta che il token viene aggiornato.
// Salvataggio del token in SharedPreferences e invio al server
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)
}
}
Il server deve memorizzare il Registration Token in associazione con l'identificatore utente. Quando il token viene aggiornato, il client invia il nuovo token al server e il server sostituisce il vecchio. Si consiglia di mantenere una cronologia dei token: se una notifica non viene consegnata al nuovo token, si può provare con il vecchio.
Firebase può restituire un errore di ottenimento del token in diversi casi. Assenza di Google Play Services sul dispositivo — il token non verrà ottenuto. Superamento della quota di richieste a FCM — è necessario implementare un backoff esponenziale nei tentativi. Scadenza del token — SDK richiede automaticamente un nuovo token.
| Situazione | Risultato | Azione dello sviluppatore |
|---|---|---|
| Cancellazione dell'app | Token revocato | Eliminare il token dal database |
| Ripristino da backup | Nuovo token | Aggiornare nel database |
| Reset di Google Play Services | Token rigenerato | Gestire onNewToken |
| Scadenza del token | Aggiornamento automatico | Iscriversi agli aggiornamenti |
Domande frequenti
Verificare la presenza di Google Play Services sul dispositivo, la correttezza del file google-services.json e la versione di Firebase SDK. Assicurarsi che l'applicazione abbia il permesso di accesso a Internet.
Il token può cambiare quando si disinstalla e re-installa l'applicazione, si cancellano i dati, si ripristina da un backup o si accede con un account Google diverso. Non esiste un intervallo di tempo fisso.
Sì, ogni applicazione sul dispositivo riceve il proprio token FCM. Se un dispositivo ha tre applicazioni con Firebase, ciascuna avrà il proprio Registration Token univoco.
Inviare una notifica di test tramite la console Firebase o l'API HTTP FCM. Se il token non è valido, l'API restituirà un errore UNREGISTERED o NOT_FOUND.
Un Registration Token non è una chiave segreta, ma la sua fuga consente di inviare notifiche al dispositivo dell'utente. Conservare i token in un database sicuro e utilizzare HTTPS per la trasmissione.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche