Gestisci le installazioni di Firebase

Il servizio di installazioni Firebase (FIS) fornisce un ID installazione Firebase (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 usi Firebase ID di installazione per scegliere i dispositivi target per la consegna dei messaggi.

Firebase Crashlytics

Firebase Crashlytics esegue la rotazione dell'installazione di Crashlytics UUID basato sulle modifiche al Firebase dell'istanza di app l'ID installazione. In futuro, l'ID installazione può essere usato per attivare le funzionalità migliorare i servizi di segnalazione degli arresti anomali e gestione degli arresti anomali.

Firebase In-App Messaging

Firebase In-App Messaging usi Firebase ID di installazione per scegliere i dispositivi target per la consegna dei messaggi.

Firebase Performance Monitoring

Performance Monitoring utilizza Firebase ID installazione per calcolare il numero di installazioni Firebase univoche che accedono di risorse di rete, per garantire che i pattern di accesso sono sufficientemente anonimi. Utilizza anche Firebase ID installazione con Firebase Remote Config per gestire la frequenza dei report sugli eventi di rendimento.

Firebase Remote Config

Remote Config utilizza Firebase ID installazione per selezionare la configurazione da restituire ai dispositivi degli utenti finali.

Firebase ML

Credenziali chiamate di autenticazione dell'installazione vengono utilizzati da Firebase ML per autenticazione del dispositivo durante l'interazione con l'app ad esempio per distribuire i modelli di sviluppatore alle istanze di app.

Firebase User Segmentation Storage

Lo spazio di archiviazione per la segmentazione degli utenti di Firebase archivia Firebase ID installazione e i relativi attributi e segmenti per fornire informazioni sul targeting ad altri servizi Firebase che le usano.

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

  • Per eliminare un'installazione di Firebase e i dati associati all'installazione.
  • Per recuperare gli identificatori (Firebase ID installazione) in modo da 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 delle installazioni di 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 nel tuo UIApplicationDelegate e tutti gli altri Moduli Firebase utilizzati dal delegato della tua app. 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 FirebaseApp nel delegato della tua applicazione Metodo application(_:didFinishLaunchingWithOptions:):

    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 swizzling del delegato dell'app. Per Per ulteriori informazioni, consulta le istruzioni di SwiiftUI.

    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 dell'hosting della tua applicazione web, la configurazione potrebbe gestiti automaticamente o potresti dover aggiornare Oggetto di configurazione Firebase.

Ad esempio, se le dipendenze vengono aggiunte in index.html, aggiungi il della dipendenza in <head> :

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

Flutter

  1. Dalla directory root del tuo progetto Flutter, esegui questo per installare il plug-in di installazione di Firebase:

    flutter pub add firebase_app_installations
    
  2. Ricrea il progetto:

    flutter run
    
  3. Importa il plug-in di installazione di Firebase:

    import 'package:firebase_app_installations/firebase_app_installations.dart';
    

Eliminare un'installazione di Firebase

I dati associati a un'installazione Firebase in genere non sono personali identificare. 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 diverse applicazioni sullo stesso dispositivo hanno ID installazione di Firebase diversi. Firebase ID installazione identificano l'app di installazione e dati correlati le installazioni di app.

Quando elimini un ID installazione, i dati associati l'ID installazione viene rimosso dai sistemi in tempo reale e di backup di Servizi Firebase che utilizzano gli ID installazione di Firebase per identificare le installazioni entro 180 giorni. Questa procedura è descritta in modo generale nel documento dichiarazione di eliminazione e conservazione.

A meno che non disattivi tutti i servizi di generazione FID nel tuo dell'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.

Elimina un FID con una chiamata API client

Per eliminare i dati FID generati dai servizi Firebase: chiama il metodo appropriato dall'SDK delle installazioni di 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+KTX

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 già 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 dell'ID istanza. Tuttavia, eliminano tutti FID quando viene chiamato con un qualsiasi SDK Firebase corrente).

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 API server, Firebase avviano la procedura per eliminare i dati associati a quell'ID di installazione, interrompono accettare nuovi dati per tale ID nel corso di 1-2 giorni e poi inviare una notifica al app client che l'ID è stato eliminato. Fino a quando Firebase non invia una notifica all'app client, servizi dell'app potrebbero comunque avere come target l'ID, ad esempio un account Firebase l'installazione potrebbe continuare a ricevere notifiche di FCM per alcune nell'orario lavorativo locale del TAM.

Se vuoi eliminare l'ID installazione attuale di Firebase e usarlo immediatamente Servizi Firebase con un nuovo ID non correlato, utilizza l'API client per gestire l'eliminazione.

Recuperare gli identificatori dei client

Se hai la necessità di identificare determinate installazioni della tua app, può farlo recuperando l'ID installazione di Firebase. Ad esempio, per creare segmenti di installazioni di app per l'importazione BigQuery o per eseguire durante lo sviluppo di Firebase In-App Messaging, puoi identificare e scegliere come target i dispositivi corretti utilizzando gli ID installazione di Firebase corrispondenti.

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+KTX

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 di Firebase con i token di autenticazione recuperati da FIS. Ad esempio, quando si progettano i test A/B, per Remote Config, puoi autenticare un dispositivo di test target utilizzando un token di autenticazione per l'installazione.

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

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

Il token di autenticazione per l'installazione non può essere revocato e rimane valido fino a e la relativa data di scadenza. La durata predefinita del token è una settimana.

Per recuperare un token di autenticazione per l'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+KTX

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 di Firebase

Durante il normale funzionamento di un'app, Firebase ID installazione (FID) non richiedono un monitoraggio speciale. Tuttavia, le app che recuperano e utilizzano esplicitamente i dati FID aggiungi una logica per monitorare la potenziale eliminazione o rotazione del FID. Di seguito sono riportati alcuni casi in cui I dati FID possono essere eliminati o ruotati:

  • Disinstallare o reinstallare l'app, ad esempio quando un utente finale vengono installate su un nuovo dispositivo.
  • L'utente finale svuota la cache dell'app o del dispositivo.
  • L'eliminazione dei dati FID viene attivata nel backend a causa dell'app (attualmente la soglia di inattività è di 270 giorni).

Quando le app riscontrano la rotazione o l'eliminazione FID in questi casi, viene loro assegnato un nuovo FID. Inoltre, il token di autenticazione per l'installazione associato a un FID eliminato venga eliminata indipendentemente dalla sua maturità, ed è sostituita da una nuova il token di autenticazione per l'installazione.

Le app possono monitorare questi cambiamenti e reagire 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];
}];

Una NSNotification denominata NSNotificationName.InstallationIDDidChange è pubblicato nel NSNotificationCenter predefinito ogni volta che viene FID assegnato.

Android

I client Kotlin e Java devono aggiungere la logica per i nuovi tentativi 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, il callback a cui hai effettuato l'iscrizione viene attivato:

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

Dart

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

Esegui la migrazione dall'ID istanza a Firebase installazione

Prima dell'introduzione delle installazioni di Firebase, Firebase si affidava a SDK ID istanza per gli identificatori delle installazioni di app. Firebase installazione offre vantaggi significativi rispetto all'ID istanza in termini di affidabilità, prestazioni e sicurezza. È necessario eseguire la migrazione delle app Firebase che dipendono dall'SDK dell'ID istanza a Firebase installazioni.

Il processo di migrazione varia a seconda dell'app:

  • La migrazione delle app che non richiamano direttamente le API ID istanza può aggiornando le versioni dell'SDK. La maggior parte delle app Firebase rientra in questa categoria.

  • Le app che effettuano esplicitamente chiamate API all'ID istanza devono aggiornare le versioni dell'SDK e apporta modifiche al codice per sostituire l'ID istanza con i loro Firebase installazioni o FCM equivalenti. Se la tua app utilizza ID istanza per recuperare i token di registrazione FCM o utilizzarne esplicitamente l'utilizzo ID istanza per scegliere come target le istanze di app o per qualsiasi altro scopo, dovrai aggiornare il codice dell'applicazione.

FIS è compatibile con le versioni precedenti dell'ID istanza Firebase dell'identificatore legacy. 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 per Android precedenti al 27 febbraio 2020

Ciò significa che non è necessario eseguire la migrazione delle app alle installazioni di Firebase. tuttavia, consigliamo vivamente di farlo.

Upgrade alle versioni minime dell'SDK per Firebase installazioni

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

SDK Firebase Versione minima di Android Versione iOS minima
Firebase Cloud Messaging Versione 20.3.0 Versione 6.34.0
Remote Config Versione 19.2.0 Versione 6.24.0
Google Analytics per Firebase \ (SDK Measurement) Versione 17.4.4 Versione 6.18.0
Messaggistica in-app v19.0.7 Versione 6.24.0
Performance Monitoring Versione 19.0.8 v6.21.0
Crashlytics Versione 17.2.1 v6.23.0
ML Kit Versione 22.1.2 Versione 6.28.0

Aggiornamento del codice che chiama esplicitamente le API ID istanza

Se la tua app per Android o Apple utilizza direttamente metodi SDK ID istanza, sostituire tale utilizzo con alternative identiche nelle installazioni Firebase SDK o l'SDK FCM.

Recupero di un identificatore

I metodi per ottenere gli ID istanza vengono sostituiti con metodi per ottenere un'installazione ID. 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+KTX

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+KTX

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

Eliminazione di un identificatore

I metodi per eliminare gli ID istanza vengono sostituiti con quelli per l'eliminazione 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+KTX

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 in corso...

Prima dell'introduzione delle installazioni di Firebase, FCM client recuperato 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+KTX

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+KTX

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;
  }
}];