Gérer les installations Firebase

Le service d'installation FIS (Firebase) fournit un ID d'installation (FID) de Firebase pour chaque instance installée d'une application Firebase. L'ID d'installation Firebase est utilisé en interne par ces Firebase services:

Service Firebase Fonctionnalité d'installation Firebase
Firebase Cloud Messaging

Firebase Cloud Messaging utilise les ID d'installation Firebase pour cibler les appareils pour la diffusion des messages.

Firebase Crashlytics

Firebase Crashlytics fait pivoter l'UUID d'installation Crashlytics en fonction des modifications apportées à l'ID d'installation Firebase de l'instance d'application. À l'avenir, ID d'installation peut être utilisé pour activer des fonctionnalités améliorer les services de gestion des plantages et de création de rapports d'erreur.

Firebase In-App Messaging

Firebase In-App Messaging utilisations ID d'installation Firebase permettant de cibler les appareils pour la distribution des messages.

Firebase Performance Monitoring

Performance Monitoring utilise les ID d'installation Firebase pour calculer le nombre d'installations Firebase uniques qui accèdent aux ressources réseau, pour garantir que les modèles d'accès suffisamment d'anonymat. Elle utilise également ID d'installation de Firebase avec Firebase Remote Config pour gérer le taux de reporting sur les événements liés aux performances.

Firebase Remote Config

Remote Config utilise les ID d'installation Firebase pour sélectionner une configuration à renvoyer aux appareils des utilisateurs finaux.

Firebase ML

Identifiants appelés les jetons d'authentification d'installation sont utilisés par Firebase ML pour authentification de l'appareil lors de l'interaction avec l'application Google Cloud, par exemple, pour distribuer des modèles de développement aux instances d'application.

Stockage de segmentation des utilisateurs Firebase

Le stockage de segmentation des utilisateurs Firebase stocke Firebase ID d'installation et les attributs et segments associés pour fournir des informations de ciblage aux autres services Firebase qui les utilisent.

En règle générale, les services Firebase utilisent le service d'installation Firebase sans obligeant les développeurs à interagir directement avec l'API FIS. Toutefois, dans certains cas, les développeurs d'applications API FIS, par exemple:

  • Pour supprimer une installation Firebase et les données qui lui sont associées.
  • Pour récupérer des identifiants (Firebase ID d'installation) afin de cibler des installations d'applications spécifiques.
  • Pour récupérer des jetons d'authentification d'installation afin d'authentifier les installations Firebase.

Pour commencer à appeler directement l'API FIS, ajoutez le SDK à votre application.

Ajouter le SDK d'installations Firebase à votre application

iOS+

  1. Ajoutez la dépendance pour les installations Firebase à votre Podfile:
    pod 'FirebaseInstallations'
  2. Exécutez pod install et ouvrez le fichier .xcworkspace créé.
  3. Importez le module FirebaseCore dans votre UIApplicationDelegate, ainsi que toute autre Modules Firebase que votre délégué d'application utilise. Par exemple, pour utiliser Cloud Firestore et 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. Configurez un FirebaseApp l'instance partagée dans le bucket du délégué Méthode 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. Si vous utilisez SwiftUI, vous devez créer un délégué d'application et l'associer à votre struct App via UIApplicationDelegateAdaptor ou NSApplicationDelegateAdaptor. Vous devez également désactiver le swizzling du délégué d'application. Pour Pour en savoir plus, consultez les instructions de 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

Ajoutez la dépendance pour le SDK Android d'installation Firebase à votre module (au niveau de l'application) Gradle (généralement app/build.gradle):

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

JavaScript

Selon la façon dont votre application Web est hébergée, votre configuration peut être gérée automatiquement ou vous devrez peut-être mettre à jour votre objet de configuration Firebase.

Par exemple, si vos dépendances sont ajoutées dans index.html, ajoutez le paramètre la dépendance dans la balise <head> :

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

Flutter

  1. À partir du répertoire racine de votre projet Flutter, exécutez la commande suivante : pour installer le plug-in d'installation Firebase:

    flutter pub add firebase_app_installations
    
  2. Recompilez votre projet:

    flutter run
    
  3. Importez le plug-in d'installation Firebase :

    import 'package:firebase_app_installations/firebase_app_installations.dart';
    

Supprimer une installation de Firebase

Les données liées à une installation Firebase ne sont généralement pas personnelles identifier. Toutefois, il peut être utile de donner aux utilisateurs la possibilité de gérer et de supprimer ces données.

Les ID d'installation Firebase sont différents pour chaque installation de chaque application; applications différentes sur un même appareil ID d'installation Firebase. Firebase ID d'installation identifient l'appli les installations et les données liées ces installations d'applications.

Lorsque vous supprimez un ID d'installation, les données associées à cet ID d'installation sont supprimées des systèmes en ligne et de sauvegarde de tous les services Firebase qui utilisent des ID d'installation Firebase pour identifier les installations dans un délai de 180 jours. Ce processus est décrit dans les grandes lignes dans les relative à la suppression et à la conservation de données.

Sauf si vous désactivez tous les services générant des FID dans votre application, FIS crée un nouvel identifiant en quelques jours. Firebase considère l'ID nouvellement créé comme une nouvelle installation de Firebase. ne l’associe en aucune façon à l’identifiant ou aux données précédents.

Supprimer un FID avec un appel d'API cliente

Pour supprimer les FID générés par les services Firebase, Appelez la méthode appropriée à partir du SDK d'installation 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();

Supprimer un FID avec un appel d'API de serveur

Pour supprimer un FID avec une API de serveur ajoutez le SDK Admin Firebase à votre serveur, si ce n'est pas déjà fait.

Une fois le SDK ajouté, supprimez les FID via un appel à de suppression de contenu dans le langage de votre choix (remarque: à l'exception de Node.js, reflètent la dénomination des ID d'instance. Cependant, ils suppriment tous FID en cas d'appel avec n'importe quel SDK Firebase actuel).

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)

Accéder

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)
}

Lorsque vous supprimez un ID d'installation Firebase avec un appel d'API de serveur, Firebase lancent le processus de suppression des données liées à l'ID d'installation, de nouvelles données pour cet identifiant sur une période d'un à deux jours, puis notifiez le application cliente dont l'ID a été supprimé. Tant que Firebase n'a pas averti l'application cliente, des services de l'application peuvent toujours cibler l'ID. Par exemple, un service Firebase l'installation peut continuer de recevoir des notifications FCM pendant quelques heures.

Si vous souhaitez supprimer l'ID d'installation Firebase actuel et utiliser immédiatement les services Firebase avec un nouvel ID sans rapport, utilisez l'API client pour gérer la suppression.

Récupérer les identifiants client

Si vous avez besoin d'identifier des installations particulières de votre application, vous Pour ce faire, récupérez l'ID d'installation Firebase. Par exemple, pour créer d'installations d'applications pour importer BigQuery pendant le développement de Firebase In-App Messaging, vous pouvez identifier et cibler les appareils appropriés à l'aide des ID d'installation Firebase correspondants.

Pour récupérer un ID d'installation 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();

Récupérer les jetons d'authentification d'installation

Les services Firebase peuvent authentifier les installations Firebase avec des jetons d'authentification récupérées à partir du système FIS. Par exemple, lors de la conception de tests A/B pour Remote Config, vous pouvez authentifier un appareil de test ciblé en utilisant un jeton d'authentification d'installation.

Un jeton d'autorisation d'installation est un jeton de support de courte durée au format jeton Web JSON (JWT) contenant les informations suivantes pour une installation :

  • ID d'installation Firebase
  • Le projet associé (projectNumber)
  • ID d'application Firebase associé (appId)
  • Date d'expiration du jeton

Un jeton d'autorisation d'installation ne peut pas être révoqué et reste valide jusqu'à sa date d'expiration. La durée de vie par défaut du jeton est d'une semaine.

Pour récupérer un jeton d'authentification d'installation:

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();

Surveiller le cycle de vie de l'ID d'installation Firebase

Lors du fonctionnement normal d'une application, les ID d'installation (FID) Firebase ne nécessitent pas de surveillance particulière. Toutefois, les applications qui récupèrent et utilisent explicitement les FID doivent ajouter une logique pour surveiller la suppression ou la rotation potentielle FID. Voici quelques cas où les FID peuvent être supprimés ou remplacés :

  • Désinstallation ou réinstallation de l'application, par exemple lorsqu'un utilisateur final sur un nouvel appareil.
  • L'utilisateur final vide le cache de l'application ou de l'appareil.
  • La suppression du FID est déclenchée dans le backend en raison de l'inactivité de l'application (actuellement, le seuil est de 270 jours d'inactivité).

Lorsque les applis subissent une rotation ou une suppression du FID dans ces un nouveau FID leur est attribué. Par ailleurs, le jeton d'authentification d'installation associé à un FID supprimé est supprimé, quelle que soit sa date d'échéance, et est remplacé par un nouveau et le jeton d'authentification d'installation.

Les applications peuvent surveiller ces changements et réagir en conséquence.

Pour surveiller la rotation des FID :

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

Une NSNotification nommée NSNotificationName.InstallationIDDidChange est publié sur le NSNotificationCenter par défaut dès qu'une nouvelle Un FID est attribué.

Android

Les clients Kotlin et Java doivent ajouter une logique de nouvelle tentative pour répondre aux appels ayant échoué afin de récupérer le nouveau FID.

JavaScript

Les applications Web peuvent s'abonner au hook onIdChange.

Chaque fois qu'un FID est créé, le rappel souscrit est déclenché :

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

Dart

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

Migrer de l'ID d'instance vers les installations Firebase

Avant le lancement des installations Firebase, Firebase utilisait SDK d'ID d'instance pour les identifiants des installations d'applications Firebase installations offre des avantages considérables par rapport à l'ID d'instance en termes de fiabilité, de performances et la sécurité. Les applications Firebase qui dépendent du SDK de l'ID d'instance doivent migrer à Firebase installations.

Le processus de migration varie en fonction de votre application:

  • Les applications qui n'appellent pas directement les API d'ID d'instance peuvent migrer mettre à jour les versions de leurs SDK ; La plupart des applications Firebase appartiennent à cette catégorie.

  • Les applications qui effectuent explicitement des appels d'API vers l'ID d'instance doivent mettre à jour les versions du SDK et modifier le code pour remplacer l'ID d'instance avec leur Installations Firebase ou équivalents FCM. Si votre application utilise ID d'instance pour récupérer les jetons d'enregistrement FCM ou utilise explicitement ID d'instance pour cibler les instances d'application ou à toute autre fin, vous devez mettre à jour le code de votre application.

Actuellement, le système FIS est rétrocompatible avec l'ancien identifiant de l'ID d'instance Firebase. La suppression d'un IID est une autre méthode pour demander la suppression de données avec ces SDK Firebase :

  • iOS 6.14.0 ou version antérieure
  • SDK Android antérieurs au 27 février 2020

Cela signifie que les applications ne sont pas obligatoires de migrer vers des installations Firebase. Toutefois, nous vous recommandons vivement de le faire.

Mise à niveau vers la version minimale du SDK pour les installations Firebase

Pour migrer des installations d'ID d'instance vers Firebase, assurez-vous que votre applications utilisent au moins les numéros de version minimaux répertoriés SDK Firebase suivants:

SDK Firebase Version Android minimale Version minimale d'iOS
Firebase Cloud Messaging v20.3.0 v6.34.0
Remote Config v19.2.0 v6.24.0
Google Analytics pour Firebase \ (SDK de mesure) v17.4.4 v6.18.0
Messagerie dans l'application 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

Mettre à jour du code qui appelle explicitement les API d'ID d'instance

Si votre application Android ou Apple utilise directement les méthodes du SDK d'ID d'instance, vous pouvez remplacez cette utilisation par des alternatives identiques dans les installations Firebase. ou le SDK FCM.

Récupérer un identifiant

Les méthodes permettant d'obtenir les ID d'instance sont remplacées par des méthodes permettant d'obtenir une installation ID. Exemple :

Avant

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)
        }

Après

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")
    }
}

Supprimer un identifiant

Les méthodes de suppression des ID d'instance sont remplacées par des méthodes de suppression ID d'installation Firebase. Exemple :

Avant

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();

Après

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")
    }
}

Récupérer un jeton d'enregistrement FCM

Avant le lancement des installations Firebase, FCM clients récupéré les jetons d'enregistrement à partir de l'ID d'instance. Le SDK FCM fournit des méthodes pour récupérer le jeton d'enregistrement.

Avant

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

Après

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