Gestisci le installazioni di Firebase

Il servizio di installazioni Firebase (FIS) fornisce un Firebase ID installazione (FID) per ogni istanza installata di un'app Firebase. L'ID installazione Firebase viene utilizzato internamente da questi servizi Firebase:

Servizio Firebase Funzionalità di Firebase installazioni
Firebase Cloud Messaging

Firebase Cloud Messaging utilizza Firebase ID installazione per scegliere come target i dispositivi per l'invio dei messaggi.

Firebase Crashlytics

Firebase Crashlytics ruota l'UUID di installazioneCrashlytics in base alle modifiche all'ID di installazione Firebase dell'istanza dell'app. In futuro, l'ID installazione potrebbe essere utilizzato per attivare funzionalità che migliorano i servizi di generazione di report sugli arresti anomali e di gestione degli arresti anomali.

Firebase In-App Messaging

Firebase In-App Messaging utilizza Firebase ID installazione per scegliere come target i dispositivi per l'invio dei messaggi.

Firebase Performance Monitoring

Performance Monitoring utilizza gli ID installazione Firebase per calcolare il numero di installazioni Firebase univoche che accedono alle risorse di rete, in modo da garantire che i pattern di accesso siano sufficientemente anonimi. Utilizza inoltre ID installazione Firebase con Firebase Remote Config per gestire la frequenza di generazione dei report sugli eventi di rendimento.

Firebase Remote Config

Remote Config utilizza gli ID installazione Firebase per selezionare i valori di configurazione da restituire ai dispositivi degli utenti finali.

Firebase ML

Le credenziali chiamate token di autenticazione dell'installazione vengono utilizzate da Firebase ML per l'autenticazione del dispositivo quando interagisce con le istanze di app, ad esempio per distribuire i modelli per sviluppatori alle istanze di app.

Firebase User Segmentation Storage

Firebase User Segmentation Storage archivia gli Firebase ID installazione e gli attributi e i segmenti correlati per fornire informazioni sul targeting ad altri servizi Firebase che li utilizzano.

In genere, i servizi Firebase utilizzano il servizio di Firebase installazioni senza richiedere agli sviluppatori di interagire direttamente con l'API FIS. Tuttavia, in alcuni casi gli sviluppatori di app potrebbero voler chiamare direttamente l'API FIS, ad esempio:

  • Per eliminare un'installazione Firebase e i dati associati.
  • Per recuperare gli identificatori (ID installazione Firebase) al fine di scegliere come target installazioni di app specifiche.
  • Per recuperare i token di autenticazione dell'installazione per autenticare le installazioni di Firebase.

Per iniziare a chiamare direttamente l'API FIS, aggiungi l'SDK alla tua app.

Aggiungi l'SDK per le installazioni Firebase alla tua app

iOS+

  1. Aggiungi la dipendenza per le installazioni di Firebase al tuo Podfile:
    pod 'FirebaseInstallations'
  2. Esegui pod install e apri il file .xcworkspace creato.
  3. Importa il modulo FirebaseCore in UIApplicationDelegate, nonché eventuali altri moduli Firebase utilizzati dal tuo app delegate. Ad esempio, per utilizzare Cloud Firestore e Authentication:

    SwiftUI

    import SwiftUI
    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Swift

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objective-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  4. Configura un'istanza condivisa FirebaseApp nel metodo application(_:didFinishLaunchingWithOptions:) del delegato dell'app:

    SwiftUI

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Swift

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  5. Se utilizzi SwiftUI, devi creare un delegato dell'applicazione e collegarlo alla tua struct App tramite UIApplicationDelegateAdaptor o NSApplicationDelegateAdaptor. Devi anche disattivare lo scambio del delegato dell'app. Per maggiori informazioni, consulta le istruzioni di SwiftUI.

    SwiftUI

    @main
    struct YourApp: App {
      // register app delegate for Firebase setup
      @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    
      var body: some Scene {
        WindowGroup {
          NavigationView {
            ContentView()
          }
        }
      }
    }
          

Android

Aggiungi la dipendenza per l'SDK Android delle installazioni Firebase al file Gradle del modulo (a livello di app) (di solito app/build.gradle):

implementation 'com.google.firebase:firebase-installations:18.0.0'

JavaScript

A seconda di come è ospitata l'applicazione web, la configurazione potrebbe essere gestita automaticamente o potrebbe essere necessario aggiornare l'oggetto di configurazione Firebase.

Ad esempio, se le dipendenze vengono aggiunte in index.html, aggiungi la dipendenza nell'elemento <head>:

<script src="/__/firebase/11.0.2/firebase-installations.js"></script>

Flutter

  1. Dalla directory principale del progetto Flutter, esegui il seguente comando per installare il plug-in di installazione Firebase:

    flutter pub add firebase_app_installations
    
  2. Ricostruisci il progetto:

    flutter run
    
  3. Importa il plug-in per le installazioni Firebase:

    import 'package:firebase_app_installations/firebase_app_installations.dart';
    

Eliminare un'installazione di Firebase

I dati associati a un'installazione di Firebase in genere non consentono di identificare personalmente. Tuttavia, può essere utile offrire agli utenti la possibilità di gestire ed eliminare questi dati.

Gli ID installazione di Firebase sono diversi per ogni installazione di ogni applicazione; le applicazioni diverse sullo stesso dispositivo hanno ID installazione di Firebase diversi. Gli ID installazione Firebase identificano le installazioni di app e i dati correlati a queste installazioni.

Quando elimini un ID installazione, i dati associati vengono rimossi dai sistemi di produzione e di backup di tutti i servizi Firebase che utilizzano ID installazione Firebase per identificare le installazioni entro 180 giorni. Questo processo è descritto a grandi linee nella dichiarazione di Google relativa all'eliminazione e alla conservazione.

A meno che non disattivi tutti i servizi che generano FID nella tua app, FIS crea un nuovo ID entro pochi giorni. Firebase considera l'ID appena creato come una nuova installazione di Firebase e non lo associa in alcun modo all'ID o ai dati precedenti.

Eliminare un FID con una chiamata API client

Per eliminare gli FID generati dai servizi Firebase, chiama il metodo appropriato dall'SDK delle installazioni Firebase:

Swift

do {
  try await Installations.installations().delete()
  print("Installation deleted");
} catch {
  print("Error deleting installation: \(error)")
}

Objective-C

[[FIRInstallations installations] deleteWithCompletion:^(NSError *error) {
   if (error != nil) {
     NSLog(@"Error deleting Installation %@", error);
     return;
   }
   NSLog(@"Installation deleted");
}];

Java

FirebaseInstallations.getInstance().delete()
        .addOnCompleteListener(new OnCompleteListener<Void>() {
    @Override
    public void onComplete(@NonNull Task<Void> task) {
        if (task.isSuccessful()) {
            Log.d("Installations", "Installation deleted");
        } else {
            Log.e("Installations", "Unable to delete Installation");
        }
    }
});

Kotlin

FirebaseInstallations.getInstance().delete().addOnCompleteListener { task ->
    if (task.isComplete) {
        Log.d("Installations", "Installation deleted")
    } else {
        Log.e("Installations", "Unable to delete Installation")
    }
}

JavaScript

await firebase.installations().delete();

Dart

await FirebaseInstallations.instance.delete();

Eliminare un FID con una chiamata API del server

Per eliminare un FID con una chiamata dell'API del server, aggiungi l'SDK Firebase Admin al tuo server, se non l'hai ancora fatto.

Una volta aggiunto l'SDK, elimina gli FID tramite una chiamata alla funzione di eliminazione nella lingua che preferisci (nota: a parte Node.js, questi metodi riflettono la denominazione degli ID istanza. Tuttavia, eliminano tutte la FID quando vengono chiamate con qualsiasi SDK Firebase attuale).

Node.js

// An FIDsent from a client service SDK
const idToDelete = 'eyJhbGciOiJFUzI1N_iIs5';

admin.installations().deleteInstallation(idToDelete);

Java

// An FID sent from a client service SDK
String idToDelete = "eyJhbGciOiJFUzI1N_iIs5";

FirebaseInstanceId.getInstance().deleteInstanceIdAsync(idToDelete).get();

Python

  from firebase_admin import instance_id

  # An FID sent from a client service SDK
  id_to_delete = 'eyJhbGciOiJFUzI1N_iIs5'

  instance_id.delete_instance_id(id_to_delete)

Vai

client, err := app.InstanceId(ctx)
if err != nil {
  log.Fatalln("error initializing client", err)
}

iidToDelete := "eyJhbGciOiJFUzI1N_iIs5"
if err := client.DeleteInstanceId(ctx, iidToDelete); err != nil {
  log.Fatalln("error deleting FID", err)
}

Quando elimini un ID installazione Firebase con una chiamata all'API di un server, i servizi Firebase avviano il processo di eliminazione dei dati associati a quell'ID installazione, smettono di accettare nuovi dati per quell'ID nel corso di 1-2 giorni e poi comunicano all'app client che l'ID è stato eliminato. Fino a quando Firebase non invia una notifica all'app client, alcuni dei servizi dell'app potrebbero comunque avere come target l'ID. Ad esempio, un'installazione di Firebase potrebbe continuare a ricevere notifiche FCM per alcune ore.

Se vuoi eliminare l'ID installazione Firebase corrente e utilizzare immediatamente i servizi Firebase con un nuovo ID non correlato, utilizza l'API client per gestire l'eliminazione.

Recuperare gli identificatori dei client

Se devi identificare installazioni specifiche della tua app, puoi farlo recuperando l'ID installazione Firebase. Ad esempio, per creare segmenti di installazioni di app per l'importazione in BigQuery o per eseguire test durante lo sviluppo di Firebase In-App Messaging, puoi identificare e scegliere come target i dispositivi corretti utilizzando gli ID installazione di Firebase In-App Messaging corrispondenti.Firebase

Per recuperare un ID installazione Firebase:

Swift

do {
  let id = try await Installations.installations().installationID()
  print("Installation ID: \(id)")
} catch {
  print("Error fetching id: \(error)")
}

Objective-C

[[FIRInstallations installations] installationIDWithCompletion:^(NSString *identifier, NSError *error) {
  if (error != nil) {
    NSLog(@"Error fetching Installation ID %@", error);
    return;
  }
  NSLog(@"Installation ID: %@", identifier);
}];

Java

FirebaseInstallations.getInstance().getId()
        .addOnCompleteListener(new OnCompleteListener<String>() {
    @Override
    public void onComplete(@NonNull Task<String> task) {
        if (task.isSuccessful()) {
            Log.d("Installations", "Installation ID: " + task.getResult());
        } else {
            Log.e("Installations", "Unable to get Installation ID");
        }
    }
});

Kotlin

FirebaseInstallations.getInstance().id.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        Log.d("Installations", "Installation ID: " + task.result)
    } else {
        Log.e("Installations", "Unable to get Installation ID")
    }
}

JavaScript

const installationId = await firebase.installations().getId();
console.log(installationId);

Dart

String id = await FirebaseInstallations.instance.getId();

Recupera i token di autenticazione dell'installazione

I servizi Firebase possono autenticare le installazioni Firebase con i token di autenticazione recuperati da FIS. Ad esempio, quando progetti test A/B per Remote Config, puoi autenticare un dispositivo di test di destinazione utilizzando un token di autenticazione dell'installazione.

Un token di autenticazione dell'installazione è un token bearer di breve durata in formato JSON Web Token (JWT) contenente le seguenti informazioni per un'installazione:

  • L'ID installazione Firebase
  • Il progetto associato (projectNumber)
  • L'ID applicazione Firebase associato (appId)
  • La data di scadenza del token

Un token di autenticazione dell'installazione non può essere revocato e rimane valido fino alla data di scadenza. La durata predefinita del token è una settimana.

Per recuperare un token di autenticazione dell'installazione:

Swift

do {
  let result = try await Installations.installations()
    .authTokenForcingRefresh(true)
  print("Installation auth token: \(result.authToken)")
} catch {
  print("Error fetching token: \(error)")
}

Objective-C

[[FIRInstallations installations] authTokenForcingRefresh:true
                                               completion:^(FIRInstallationsAuthTokenResult *result, NSError *error) {
  if (error != nil) {
    NSLog(@"Error fetching Installation token %@", error);
    return;
  }
  NSLog(@"Installation auth token: %@", [result authToken]);
}];

Java

FirebaseInstallations.getInstance().getToken(/* forceRefresh */true)
        .addOnCompleteListener(new OnCompleteListener<InstallationTokenResult>() {
    @Override
    public void onComplete(@NonNull Task<InstallationTokenResult> task) {
        if (task.isSuccessful() && task.getResult() != null) {
            Log.d("Installations", "Installation auth token: " + task.getResult().getToken());
        } else {
            Log.e("Installations", "Unable to get Installation auth token");
        }
    }
});

Kotlin

val forceRefresh = true
FirebaseInstallations.getInstance().getToken(forceRefresh)
    .addOnCompleteListener { task ->
        if (task.isSuccessful) {
            Log.d("Installations", "Installation auth token: " + task.result?.token)
        } else {
            Log.e("Installations", "Unable to get Installation auth token")
        }
    }

JavaScript

const installationToken = await firebase.installations()
    .getToken(/* forceRefresh */ true);
console.log(installationToken);

Dart

String token = await FirebaseInstallations.instance.getToken();

Monitora il ciclo di vita dell'ID installazione Firebase

Durante il normale funzionamento di un'app, gli Firebase ID installazione (FID) non richiedono un monitoraggio speciale. Tuttavia, le app che recuperano e utilizzano esplicitamente gli FID devono aggiungere una logica per monitorare la potenziale eliminazione o rotazione dell'FID. Ecco alcuni casi in cui gli FID potrebbero essere eliminati o ruotati:

  • Disinstallazione o reinstallazione dell'app, ad esempio quando un utente finale la installa su un nuovo dispositivo.
  • L'utente finale svuota la cache dell'app o del dispositivo.
  • L'eliminazione dell'ID cliente viene attivata nel backend a causa dell'inattività dell'app (attualmente la soglia è di 270 giorni di inattività).

Quando le app subiscono la rotazione o l'eliminazione dell'ID utente in questi tipi di casi, viene assegnato un nuovo ID utente. Inoltre, il token di autenticazione dell'installazione associato a un FID eliminato viene eliminato, indipendentemente dal suo stato di maturità, e sostituito con un nuovo token di autenticazione dell'installazione.

Le app possono monitorare queste modifiche e rispondere di conseguenza.

Per monitorare la rotazione dell'ID utente:

Swift

installationIDObserver = NotificationCenter.default.addObserver(
        forName: .InstallationIDDidChange,
        object: nil,
        queue: nil
) { (notification) in
  // Fetch new Installation ID
  Task {
    await self.fetchInstallationToken()
  }
}

Objective-C

__weak __auto_type weakSelf = self;
self.installationIDObserver = [[NSNotificationCenter defaultCenter]
        addObserverForName: FIRInstallationIDDidChangeNotification
                    object:nil
                     queue:nil
                usingBlock:^(NSNotification * _Nonnull notification) {
    // Fetch new Installation ID
    [weakSelf fetchInstallationsID];
}];

Un NSNotification denominato NSNotificationName.InstallationIDDidChange viene posted nel NSNotificationCenter predefinito ogni volta che viene assegnato un nuovo FID.

Android

I client Kotlin e Java devono aggiungere una logica di ripetizione per rispondere alle chiamate non riuscite per recuperare il nuovo FID.

JavaScript

Le app web possono iscriversi all'hook onIdChange.

Ogni volta che viene creato un nuovo FID, viene attivato il callback sottoscritto:

await firebase.installations().onIdChange((newId) => {
  console.log(newId);
  // TODO: Handle new installation ID.
});

Dart

FirebaseInstallations.instance.onIdChange.listen((token) {
  print('FID token: $token');
});

Eseguire la migrazione dall'ID istanza alle installazioni Firebase

Prima dell'introduzione delle installazioni Firebase, Firebase si basava sull'SDK Instance ID per gli identificatori delle installazioni di app. Le installazioni di Firebase offrono vantaggi significativi rispetto all'ID istanza in termini di affidabilità, prestazioni e sicurezza. Le app Firebase che dipendono dall'SDK Instance ID devono eseguire la migrazione alle installazioni Firebase.

La procedura di migrazione è diversa a seconda dell'app:

  • Le app che non richiamano direttamente le API Instance ID possono eseguire la migrazione aggiornando le versioni dell'SDK. La maggior parte delle app Firebase rientra in questa categoria.

  • Le app che eseguono chiamate API esplicite a Instance ID devono aggiornare le versioni dell'SDK e apportare modifiche al codice per sostituire i metodi Instance ID con le rispettive installazioniFirebase o equivalenti FCM. Se la tua app utilizza ID istanza per recuperare i token di registrazione FCM o utilizza esplicitamente ID istanza per scegliere come target le istanze dell'app o per qualsiasi altro scopo, dovrai aggiornare il codice dell'applicazione.

Al momento, FIS è compatibile con gli identificatori precedenti Firebase Instance ID. L'eliminazione di un IID è un metodo alternativo per richiedere l'eliminazione dei dati con questi SDK Firebase:

  • iOS 6.14.0 e versioni precedenti
  • SDK Android precedenti al 27 febbraio 2020

Ciò significa che non è obbligatorio eseguire la migrazione delle app alle installazioni Firebase, ma è vivamente consigliato.

Upgrade alle versioni minime dell'SDK per le installazioni di Firebase

Per eseguire la migrazione dalle installazioni di Instance ID a Firebase, assicurati che le tue applicazioni utilizzino almeno i numeri di versione minima elencati dei seguenti SDK Firebase:

SDK Firebase Versione Android minima Versione iOS minima
Firebase Cloud Messaging v20.3.0 v6.34.0
Remote Config v19.2.0 v6.24.0
Google Analytics for Firebase (SDK di misurazione) v17.4.4 v6.18.0
Messaggistica in-app v19.0.7 v6.24.0
Performance Monitoring v19.0.8 v6.21.0
Crashlytics v17.2.1 v6.23.0
ML Kit v22.1.2 v6.28.0

Aggiornamento del codice che chiama esplicitamente le API Instance ID

Se la tua app per Android o Apple utilizza direttamente i metodi dell'SDK Instance ID, puoi sostituire questo utilizzo con alternative identiche nell'SDK per le installazioni Firebase o nell'SDK FCM.

Recupero di un identificatore

I metodi per ottenere gli ID istanza vengono sostituiti da metodi per ottenere un ID installazioni. Ad esempio:

Prima

Swift

Messaging.messaging().token { token, error in
  if let error = error {
    print("Error fetching remote FCM registration token: \(error)")
  } else if let token = token {
    print("Remote instance ID token: \(token)")
    self.remoteFCMTokenMessage.text = "Remote FCM registration token: \(token)"
  }
}

Objective-C

[[FIRMessaging messaging] tokenWithCompletion:^(NSString * _Nullable token, NSError * _Nullable error) {
   if (error != nil) {
     NSLog(@"Error fetching the remote FCM registration token: %@", error);
   } else {
     NSLog(@"Remote FCM registration token: %@", token);
     NSString* message =
       [NSString stringWithFormat:@"FCM registration token: %@", token];
     self.remoteFCMTokenMessage.text = message;
   }
 }];

Java

FirebaseInstanceId.getInstance().getInstanceId()
        .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
            @Override
            public void onComplete(@NonNull Task<InstanceIdResult> task) {
                Log.d("IID_TOKEN", task.getResult().getToken());
            }
        });

Kotlin

FirebaseInstanceId.getInstance().instanceId
        .addOnSuccessListener { result ->
            Log.d("IID_TOKEN", result.token)
        }

Dopo

Swift

do {
  let id = try await Installations.installations().installationID()
  print("Installation ID: \(id)")
} catch {
  print("Error fetching id: \(error)")
}

Objective-C

[[FIRInstallations installations] installationIDWithCompletion:^(NSString *identifier, NSError *error) {
  if (error != nil) {
    NSLog(@"Error fetching Installation ID %@", error);
    return;
  }
  NSLog(@"Installation ID: %@", identifier);
}];

Java

FirebaseInstallations.getInstance().getId()
        .addOnCompleteListener(new OnCompleteListener<String>() {
    @Override
    public void onComplete(@NonNull Task<String> task) {
        if (task.isSuccessful()) {
            Log.d("Installations", "Installation ID: " + task.getResult());
        } else {
            Log.e("Installations", "Unable to get Installation ID");
        }
    }
});

Kotlin

FirebaseInstallations.getInstance().id.addOnCompleteListener { task ->
    if (task.isSuccessful) {
        Log.d("Installations", "Installation ID: " + task.result)
    } else {
        Log.e("Installations", "Unable to get Installation ID")
    }
}

Eliminare un identificatore

I metodi per eliminare gli ID istanza vengono sostituiti con metodi per eliminare Firebase ID installazione. Ad esempio:

Prima

Swift

InstanceID.instanceID().deleteID { error in
  if let error = error {
    print("Error deleting instance ID: \(error)")
  }
}

Objective-C

[FIRInstanceID instanceID] deleteIDWithHandler:^(NSError *error) {
  if error != nil {
    NSLog(@"Error deleting instance ID: %@", error);
  }
}];

Android

FirebaseInstanceId.deleteInstanceId();

Dopo

Swift

func delete(completion: @escaping (Error?) -> Void)

Objective-C

- (void)deleteWithCompletion:(nonnull void (^)(NSError *_Nullable))completion;

Java

FirebaseInstallations.getInstance().delete()
        .addOnCompleteListener(new OnCompleteListener<Void>() {
    @Override
    public void onComplete(@NonNull Task<Void> task) {
        if (task.isSuccessful()) {
            Log.d("Installations", "Installation deleted");
        } else {
            Log.e("Installations", "Unable to delete Installation");
        }
    }
});

Kotlin

FirebaseInstallations.getInstance().delete().addOnCompleteListener { task ->
    if (task.isComplete) {
        Log.d("Installations", "Installation deleted")
    } else {
        Log.e("Installations", "Unable to delete Installation")
    }
}

Recupero di un token di registrazione FCM

Prima dell'introduzione delle installazioni Firebase, i clienti FCM recuperavano i token di registrazione dall'ID istanza. Ora l'SDK FCM fornisce metodi per recuperare il token di registrazione.

Prima

Java

FirebaseInstanceId.getInstance().getInstanceId()
        .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
            @Override
            public void onComplete(@NonNull Task<InstanceIdResult> task) {
                if (!task.isSuccessful()) {
                    Log.w(TAG, "getInstanceId failed", task.getException());
                    return;
                }

                // Get new Instance ID token
                String token = task.getResult().getToken();

                // Log and toast
                String msg = getString(R.string.msg_token_fmt, token);
                Log.d(TAG, msg);
                Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
            }
        });

Kotlin

FirebaseInstanceId.getInstance().instanceId
        .addOnCompleteListener(OnCompleteListener { task ->
            if (!task.isSuccessful) {
                Log.w(TAG, "getInstanceId failed", task.exception)
                return@OnCompleteListener
            }

            // Get new Instance ID token
            val token = task.result?.token

            // Log and toast
            val msg = getString(R.string.msg_token_fmt, token)
            Log.d(TAG, msg)
            Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
        })

Swift

Messaging.messaging().token { token, error in
  if let error = error {
    print("Error fetching remote FCM registration token: \(error)")
  } else if let token = token {
    print("Remote instance ID token: \(token)")
    self.remoteFCMTokenMessage.text = "Remote FCM registration token: \(token)"
  }
}

Objective-C

[[FIRMessaging messaging] tokenWithCompletion:^(NSString * _Nullable token, NSError * _Nullable error) {
   if (error != nil) {
     NSLog(@"Error fetching the remote FCM registration token: %@", error);
   } else {
     NSLog(@"Remote FCM registration token: %@", token);
     NSString* message =
       [NSString stringWithFormat:@"FCM registration token: %@", token];
     self.remoteFCMTokenMessage.text = message;
   }
 }];

Dopo

Java

FirebaseMessaging.getInstance().getToken()
    .addOnCompleteListener(new OnCompleteListener<String>() {
        @Override
        public void onComplete(@NonNull Task<String> task) {
          if (!task.isSuccessful()) {
            Log.w(TAG, "Fetching FCM registration token failed", task.getException());
            return;
          }

          // Get new FCM registration token
          String token = task.getResult();

          // Log and toast
          String msg = getString(R.string.msg_token_fmt, token);
          Log.d(TAG, msg);
          Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
    });

Kotlin

FirebaseMessaging.getInstance().token.addOnCompleteListener(OnCompleteListener { task ->
    if (!task.isSuccessful) {
        Log.w(TAG, "Fetching FCM registration token failed", task.exception)
        return@OnCompleteListener
    }

    // Get new FCM registration token
    val token = task.result

    // Log and toast
    val msg = getString(R.string.msg_token_fmt, token)
    Log.d(TAG, msg)
    Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
})

Swift

Messaging.messaging().token { token, error in
  if let error = error {
    print("Error fetching FCM registration token: \(error)")
  } else if let token = token {
    print("FCM registration token: \(token)")
    self.fcmRegTokenMessage.text  = "Remote FCM registration token: \(token)"
  }
}

Objective-C

[[FIRMessaging messaging] tokenWithCompletion:^(NSString *token, NSError *error) {
  if (error != nil) {
    NSLog(@"Error getting FCM registration token: %@", error);
  } else {
    NSLog(@"FCM registration token: %@", token);
    self.fcmRegTokenMessage.text = token;
  }
}];