Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Administrar instalaciones de Firebase

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

El servicio de instalaciones de Firebase (FIS) proporciona un ID de instalación de Firebase (FID) para cada instancia instalada de una aplicación de Firebase. Estos servicios de Firebase utilizan internamente el ID de instalación de Firebase:

Servicio de base de fuego Funcionalidad de instalaciones de Firebase
Mensajería en la nube de Firebase

Firebase Cloud Messaging usa los ID de instalación de Firebase para dirigirse a los dispositivos para la entrega de mensajes.

Mensajería en la aplicación de Firebase

Firebase In-App Messaging usa los ID de instalación de Firebase para dirigirse a los dispositivos para la entrega de mensajes.

Supervisión del rendimiento de Firebase

Performance Monitoring usa los ID de instalación de Firebase para calcular la cantidad de instalaciones únicas de Firebase que acceden a los recursos de la red, a fin de garantizar que los patrones de acceso sean lo suficientemente anónimos. También usa los ID de instalación de Firebase con Firebase Remote Config para administrar la tasa de informes de eventos de rendimiento.

Configuración remota de Firebase

Remote Config usa los ID de instalación de Firebase para seleccionar los valores de configuración para volver a los dispositivos de los usuarios finales.

Base de fuego ML

Firebase ML usa credenciales denominadas tokens de autenticación de instalación para la autenticación de dispositivos al interactuar con instancias de aplicaciones, por ejemplo, para distribuir modelos de desarrolladores a instancias de aplicaciones.

Almacenamiento de segmentación de usuarios de Firebase

Firebase User Segmentation Storage almacena los ID de instalación de Firebase y los atributos y segmentos relacionados para proporcionar información de orientación a otros servicios de Firebase que los utilizan.

Por lo general, los servicios de Firebase usan el servicio de instalaciones de Firebase sin requerir que los desarrolladores interactúen directamente con la API de FIS. Sin embargo, hay casos en los que los desarrolladores de aplicaciones pueden querer llamar directamente a la API de FIS, como:

  • Para eliminar una instalación de Firebase y los datos vinculados a la instalación.
  • Para recuperar identificadores (ID de instalación de Firebase) para apuntar a instalaciones de aplicaciones específicas.
  • Para recuperar tokens de autenticación de instalación para autenticar las instalaciones de Firebase.

Para comenzar a llamar directamente a la API de FIS, agregue el SDK a su aplicación.

Agregue el SDK de instalaciones de Firebase a su aplicación

iOS+

  1. Agregue la dependencia para las instalaciones de Firebase a su Podfile:
    pod 'FirebaseInstallations'
  2. Ejecute pod install y abra el archivo .xcworkspace creado.
  3. Importe el módulo FirebaseCore en su UIApplicationDelegate , así como cualquier otro módulo de Firebase que use el delegado de su aplicación. Por ejemplo, para usar Cloud Firestore y autenticación:

    Rápido

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    C objetivo

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  4. Configure una instancia compartida de FirebaseApp en el método application(_:didFinishLaunchingWithOptions:) del delegado de su aplicación:

    Rápido

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

    C objetivo

    // Use Firebase library to configure APIs
    [FIRApp configure];

Androide

Agregue la dependencia para las instalaciones de Firebase SDK de Android al archivo Gradle de su módulo (nivel de aplicación) (generalmente app/build.gradle ):

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

JavaScript

Dependiendo de cómo se aloje su aplicación web, su configuración puede manejarse automáticamente o puede necesitar actualizar su objeto de configuración de Firebase .

Por ejemplo, si sus dependencias se agregan en index.html, agregue la dependencia en el elemento <head>:

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

Aleteo

  1. Desde el directorio raíz de su proyecto Flutter, ejecute el siguiente comando para instalar el complemento de instalación de Firebase:

    flutter pub add firebase_app_installations
    
  2. Reconstruya su proyecto:

    flutter run
    
  3. Importe el complemento de instalaciones de Firebase:

    import 'package:firebase_app_installations/firebase_app_installations.dart';
    

Eliminar una instalación de Firebase

Los datos vinculados a una instalación de Firebase generalmente no identifican personalmente. Aún así, puede ser útil dar a los usuarios la opción de administrar y eliminar estos datos.

Los ID de instalación de Firebase son diferentes para cada instalación de cada aplicación; diferentes aplicaciones en el mismo dispositivo tienen diferentes ID de instalación de Firebase. Los ID de instalación de Firebase identifican las instalaciones de aplicaciones y los datos vinculados a esas instalaciones de aplicaciones.

Cuando elimina una ID de instalación, los datos vinculados a esa ID de instalación se eliminan de los sistemas en vivo y de copia de seguridad de todos los servicios de Firebase que usan ID de instalación de Firebase para identificar instalaciones dentro de los 180 días. Este proceso se describe en un nivel alto en la declaración de Google sobre eliminación y retención .

A menos que deshabilite todos los servicios que generan FID en su aplicación, FIS crea una nueva ID en unos pocos días. Firebase considera que la identificación recién creada es una nueva instalación de Firebase y no la asocia con la identificación o los datos anteriores de ninguna manera.

Eliminar un FID con una llamada a la API del cliente

Para eliminar los FID generados por los servicios de Firebase, llame al método adecuado desde el SDK de instalaciones de Firebase:

Rápido

Installations.installations().delete { error in
  if let error = error {
    print("Error deleting installation: \(error)")
    return
  }
  print("Installation deleted");
}

C objetivo

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

Eliminar un FID con una llamada a la API del servidor

Para eliminar un FID con una llamada a la API del servidor, agregue el SDK de administrador de Firebase a su servidor , si aún no lo ha hecho.

Una vez que se agrega el SDK, elimine los FID a través de una llamada a la función de eliminación en el idioma de su elección (nota: a excepción de Node.js, estos métodos reflejan la denominación de ID de instancia. Sin embargo, todos eliminan el FID cuando se les llama con cualquier Firebase actual). SDK).

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

Pitón

  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)

Vamos

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

Cuando elimina un ID de instalación de Firebase con una llamada a la API del servidor, los servicios de Firebase inician el proceso para eliminar los datos vinculados a ese ID de instalación, dejan de aceptar nuevos datos para ese ID en el transcurso de 1 o 2 días y luego notifican a la aplicación cliente. que la identificación fue eliminada. Hasta que Firebase notifique a la aplicación cliente, es posible que algunos de los servicios de la aplicación sigan apuntando al ID; por ejemplo, una instalación de Firebase podría seguir recibiendo notificaciones de FCM durante algunas horas.

Si desea eliminar el ID de instalación de Firebase actual y usar inmediatamente los servicios de Firebase con un nuevo ID no relacionado, use la API del cliente para manejar la eliminación.

Recuperar identificadores de clientes

Si tiene el requisito de identificar instalaciones particulares de su aplicación, puede hacerlo recuperando el ID de instalación de Firebase. Por ejemplo, para realizar pruebas durante el desarrollo de Firebase In-App Messaging, puede identificar y apuntar al dispositivo de prueba correcto usando su ID de instalación de Firebase.

Para recuperar un ID de instalación de Firebase:

Rápido

Installations.installations().installationID { (id, error) in
  if let error = error {
    print("Error fetching id: \(error)")
    return
  }
  guard let id = id else { return }
  print("Installation ID: \(id)")
}

C objetivo

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

Recuperar tokens de autenticación de instalación

Los servicios de Firebase pueden autenticar las instalaciones de Firebase con tokens de autenticación obtenidos de FIS. Por ejemplo, al diseñar pruebas A/B para Remote Config, puede autenticar un dispositivo de prueba objetivo mediante un token de autenticación de instalación.

Un token de autenticación de instalación es un token portador de corta duración en formato JSON web token (JWT) que contiene la siguiente información para una instalación:

  • El ID de instalación de Firebase
  • El proyecto asociado ( projectNumber )
  • El ID de la aplicación Firebase asociada ( appId )
  • La fecha de caducidad del token.

Un token de autenticación de instalación no se puede revocar y sigue siendo válido hasta su fecha de vencimiento. La vida útil predeterminada del token es de una semana.

Para recuperar un token de autenticación de instalación:

Rápido

Installations.installations().authTokenForcingRefresh(true, completion: { (result, error) in
  if let error = error {
    print("Error fetching token: \(error)")
    return
  }
  guard let result = result else { return }
  print("Installation auth token: \(result.authToken)")
})

C objetivo

[[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

FirebaseInstallations.getInstance().getToken(/* forceRefresh */ true)
    .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();

Supervisar el ciclo de vida del ID de instalación de Firebase

Durante el funcionamiento normal de una aplicación, los ID de instalación (FID) de Firebase no requieren un control especial. Sin embargo, las aplicaciones que recuperan y usan FID explícitamente deben agregar lógica para monitorear la posible eliminación o rotación del FID. Estos son algunos casos en los que los FID podrían eliminarse o rotarse:

  • Desinstalación o reinstalación de la aplicación, por ejemplo, cuando un usuario final instala en un nuevo dispositivo.
  • El usuario final borra la memoria caché de la aplicación o del dispositivo.
  • La eliminación de FID se activa en el backend debido a la inactividad de la aplicación (actualmente, el umbral para esto es de 270 días de inactividad).

Cuando las aplicaciones experimentan rotación o eliminación de FID en este tipo de casos, se les asigna un nuevo FID. Además, el token de autenticación de instalación asociado con un FID eliminado se elimina, independientemente de su vencimiento, y se reemplaza con un nuevo token de autenticación de instalación.

Las aplicaciones pueden monitorear estos cambios y responder en consecuencia.

Para monitorear la rotación de FID:

Rápido

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

C objetivo

__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 denominada NSNotificationName.InstallationIDDidChange se publica en el NSNotificationCenter predeterminado cada vez que se asigna un nuevo FID.

Androide

Los clientes de Kotlin y Java deben agregar una lógica de reintento para responder a las llamadas fallidas para recuperar el nuevo FID.

JavaScript

Las aplicaciones web pueden suscribirse al gancho onIdChange .

Cada vez que se crea un nuevo FID, se activa la devolución de llamada suscrita:

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

Dart

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

Migrar de ID de instancia a instalaciones de Firebase

Antes de la introducción de las instalaciones de Firebase, Firebase confiaba en el SDK de ID de instancia para identificar las instalaciones de aplicaciones. Las instalaciones de Firebase brindan ventajas significativas sobre Instance ID en cuanto a confiabilidad, rendimiento y seguridad. Las aplicaciones de Firebase que dependen del SDK de ID de instancia deben migrar a las instalaciones de Firebase.

El proceso de migración es diferente según su aplicación:

  • Las aplicaciones que no llaman directamente a las API de ID de instancia pueden migrar actualizando sus versiones de SDK . La mayoría de las aplicaciones de Firebase entran en esta categoría.

  • Las aplicaciones que explícitamente hacen llamadas API a la ID de instancia deben actualizar las versiones de SDK y hacer cambios en el código para reemplazar los métodos de ID de instancia con sus instalaciones de Firebase o equivalentes de FCM. Si su aplicación usa el ID de instancia para recuperar tokens de registro de FCM o usa explícitamente el ID de instancia para apuntar a instancias de la aplicación o para cualquier otro propósito, deberá actualizar el código de su aplicación.

Actualmente, FIS es compatible con versiones anteriores del identificador heredado ID de instancia de Firebase. Eliminar un IID es un método alternativo para solicitar la eliminación de datos con estos SDK de Firebase:

  • iOS 6.14.0 y versiones anteriores
  • SDK de Android anteriores al 27 de febrero de 2020

Esto significa que no es necesario que las aplicaciones migren a las instalaciones de Firebase; sin embargo, hacerlo es muy recomendable.

Actualización a versiones mínimas de SDK para instalaciones de Firebase

Para migrar de Instance ID a instalaciones de Firebase, asegúrese de que sus aplicaciones usen al menos los números de versión mínimos enumerados de los siguientes SDK de Firebase:

SDK de Firebase Versión mínima de Android Versión mínima de iOS
Mensajería en la nube de Firebase v20.3.0 v6.34.0
Configuración remota v19.2.0 v6.24.0
Google Analytics para Firebase \ (SDK de medición) v17.4.4 v6.18.0
Mensajería en la aplicación v19.0.7 v6.24.0
Supervisión del rendimiento v19.0.8 v6.21.0
Crashlytics v17.2.1 v6.23.0
Juego de aprendizaje automático v22.1.2 v6.28.0

Actualización del código que llama explícitamente a las API de ID de instancia

Si su aplicación de Android o Apple usa directamente métodos SDK de ID de instancia, puede reemplazar ese uso con alternativas idénticas en el SDK de instalaciones de Firebase o el SDK de FCM.

Recuperar un identificador

Los métodos para obtener ID de instancia se reemplazan con métodos para obtener una ID de instalación. Por ejemplo:

Antes

Rápido

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

C objetivo

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

Después

Rápido

Installations.installations().installationID { (id, error) in
  if let error = error {
    print("Error fetching id: \(error)")
    return
  }
  guard let id = id else { return }
  print("Installation ID: \(id)")
}

C objetivo

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

Eliminación de un identificador

Los métodos para eliminar ID de instancia se reemplazan con métodos para eliminar ID de instalación de Firebase. Por ejemplo:

Antes

Rápido

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

C objetivo

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

Androide

FirebaseInstanceId.deleteInstanceId();

Después

Rápido

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

C objetivo

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

Recuperar un token de registro de FCM

Antes de la introducción de las instalaciones de Firebase, los clientes de FCM recuperaban los tokens de registro del ID de instancia. Ahora, el SDK de FCM proporciona métodos para recuperar el token de registro.

Antes

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

Rápido

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

C objetivo

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

Despué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()
})

Rápido

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

C objetivo

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