Gerenciar instalações do Firebase

O serviço de instalações do Firebase (FIS) fornece um ID de instalação do Firebase (FID) para cada instância instalada de um aplicativo do Firebase. O ID de instalação do Firebase é usado internamente por estes serviços do Firebase:

Serviço Firebase Funcionalidade de instalações do Firebase
Mensagens na nuvem do Firebase

O Firebase Cloud Messaging usa IDs de instalação do Firebase para direcionar dispositivos para entrega de mensagens.

Crashlytics do Firebase

O Firebase Crashlytics alterna o UUID de instalação do Crashlytics com base nas alterações no ID de instalação do Firebase da instância do aplicativo. No futuro, o ID de instalação poderá ser usado para ativar recursos que melhorem os relatórios de falhas e os serviços de gerenciamento de falhas.

Mensagens no aplicativo do Firebase

O Firebase In-App Messaging usa IDs de instalação do Firebase para direcionar dispositivos para entrega de mensagens.

Monitoramento de desempenho do Firebase

O Monitoramento de desempenho usa IDs de instalação do Firebase para calcular o número de instalações exclusivas do Firebase que acessam recursos de rede, para garantir que os padrões de acesso sejam suficientemente anônimos. Ele também usa IDs de instalação do Firebase com o Firebase Remote Config para gerenciar a taxa de relatórios de eventos de desempenho.

Configuração remota do Firebase

A Configuração remota usa IDs de instalação do Firebase para selecionar valores de configuração a serem retornados aos dispositivos do usuário final.

FirebaseML

Credenciais chamadas tokens de autenticação de instalação são usadas pelo Firebase ML para autenticação de dispositivos ao interagir com instâncias de aplicativos, por exemplo, para distribuir modelos de desenvolvedor para instâncias de aplicativos.

Armazenamento de segmentação de usuários do Firebase

O Firebase User Segmentation Storage armazena IDs de instalação do Firebase e atributos e segmentos relacionados para fornecer informações de segmentação a outros serviços do Firebase que os utilizam.

Normalmente, os serviços do Firebase usam o serviço de instalações do Firebase sem exigir que os desenvolvedores interajam diretamente com a API FIS. No entanto, há casos em que os desenvolvedores de aplicativos podem querer chamar diretamente a API FIS, como:

  • Para excluir uma instalação do Firebase e os dados vinculados à instalação.
  • Para recuperar identificadores (IDs de instalação do Firebase) para direcionar instalações de aplicativos específicas.
  • Para recuperar tokens de autenticação de instalação para autenticar instalações do Firebase.

Para começar a chamar diretamente a API FIS, adicione o SDK ao seu aplicativo.

Adicione o SDK de instalações do Firebase ao seu aplicativo

iOS+

  1. Adicione a dependência para instalações do Firebase ao seu Podfile:
    pod 'FirebaseInstallations'
  2. Execute pod install e abra o arquivo .xcworkspace criado.
  3. Importe o módulo FirebaseCore em seu UIApplicationDelegate , bem como quaisquer outros módulos Firebase que seu delegado de aplicativo usa. Por exemplo, para usar o Cloud Firestore e o Authentication:

    SwiftUI

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

    Rápido

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objetivo-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  4. Configure uma instância compartilhada FirebaseApp no ​​método application(_:didFinishLaunchingWithOptions:) delegado do seu aplicativo:

    SwiftUI

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

    Rápido

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

    Objetivo-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  5. Se estiver usando SwiftUI, você deve criar um delegado de aplicativo e anexá-lo à estrutura App por meio de UIApplicationDelegateAdaptor ou NSApplicationDelegateAdaptor . Você também deve desativar o swizzling de delegado do aplicativo. Para obter mais informações, consulte as instruções do 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

Adicione a dependência para as instalações do Firebase Android SDK ao arquivo Gradle do módulo (nível do aplicativo) (geralmente app/build.gradle ):

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

JavaScript

Dependendo de como seu aplicativo Web está hospedado, sua configuração pode ser tratada automaticamente ou pode ser necessário atualizar seu objeto de configuração do Firebase .

Por exemplo, se suas dependências forem adicionadas em index.html, adicione a dependência no elemento <head>:

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

Vibração

  1. No diretório raiz do seu projeto Flutter, execute o seguinte comando para instalar o plugin de instalações do Firebase:

    flutter pub add firebase_app_installations
    
  2. Reconstrua seu projeto:

    flutter run
    
  3. Importe o plugin de instalações do Firebase:

    import 'package:firebase_app_installations/firebase_app_installations.dart';
    

Excluir uma instalação do Firebase

Os dados vinculados a uma instalação do Firebase geralmente não identificam pessoalmente. Ainda assim, pode ser útil dar aos usuários a opção de gerenciar e excluir esses dados.

Os IDs de instalação do Firebase são diferentes para cada instalação de cada aplicativo; aplicativos diferentes no mesmo dispositivo têm IDs de instalação do Firebase diferentes. Os IDs de instalação do Firebase identificam instalações de aplicativos e dados vinculados a essas instalações de aplicativos.

Quando você exclui um ID de instalação, os dados vinculados a esse ID de instalação são removidos dos sistemas ativos e de backup de todos os serviços do Firebase que usam IDs de instalação do Firebase para identificar instalações em até 180 dias. Este processo é descrito em alto nível na declaração do Google sobre exclusão e retenção .

A menos que você desative todos os serviços de geração de FID em seu aplicativo, o FIS criará um novo ID em alguns dias. O Firebase considera o ID recém-criado como uma nova instalação do Firebase e não o associa ao ID ou aos dados anteriores de forma alguma.

Exclua um FID com uma chamada de API do cliente

Para excluir FIDs gerados pelos serviços do Firebase, chame o método apropriado no SDK de instalações do Firebase:

Rápido

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

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

Exclua um FID com uma chamada de API do servidor

Para excluir um FID com uma chamada de API do servidor, adicione o Firebase Admin SDK ao seu servidor , caso ainda não o tenha feito.

Depois que o SDK for adicionado, exclua os FIDs por meio de uma chamada para a função de exclusão no idioma de sua escolha (observação: exceto para Node.js, esses métodos refletem a nomenclatura do ID da instância. No entanto, todos eles realmente excluem o FID quando chamados com qualquer Firebase atual SDK).

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

Pitão

  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)

Ir

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 você exclui um ID de instalação do Firebase com uma chamada de API do servidor, os serviços do Firebase iniciam o processo para excluir os dados vinculados a esse ID de instalação, param de aceitar novos dados para esse ID ao longo de um ou dois dias e notificam o aplicativo cliente que o ID foi excluído. Até que o Firebase notifique o aplicativo cliente, alguns dos serviços do aplicativo ainda poderão direcionar o ID. Por exemplo, uma instalação do Firebase poderá continuar recebendo notificações do FCM por algumas horas.

Se você quiser excluir o ID de instalação atual do Firebase e usar imediatamente os serviços do Firebase com um ID novo e não relacionado, use a API do cliente para lidar com a exclusão.

Recuperar identificadores de cliente

Se você precisar identificar instalações específicas do seu aplicativo, poderá fazer isso recuperando o ID de instalação do Firebase. Por exemplo, para criar segmentos de instalações de aplicativos para importação de BiqQuery ou para realizar testes durante o desenvolvimento do Firebase In-App Messaging, você pode identificar e direcionar os dispositivos corretos usando os IDs de instalação correspondentes do Firebase.

Para recuperar um ID de instalação do Firebase:

Rápido

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

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

Recuperar tokens de autenticação de instalação

Os serviços do Firebase podem autenticar instalações do Firebase com tokens de autenticação recuperados do FIS. Por exemplo, ao projetar testes A/B para Configuração remota, você pode autenticar um dispositivo de teste direcionado usando um token de autenticação de instalação.

Um token de autenticação de instalação é um token de portador de curta duração no formato JSON web token (JWT) que contém as seguintes informações para uma instalação:

  • O ID de instalação do Firebase
  • O projeto associado ( projectNumber )
  • O ID do aplicativo Firebase associado ( appId )
  • A data de validade do token

Um token de autenticação de instalação não pode ser revogado e permanece válido até a data de expiração. A vida útil do token padrão é de uma semana.

Para recuperar um token de autenticação de instalação:

Rápido

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

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

Monitore o ciclo de vida do ID de instalação do Firebase

Durante a operação normal de um aplicativo, os IDs de instalação (FIDs) do Firebase não exigem monitoramento especial. No entanto, os aplicativos que recuperam e usam FIDs explicitamente devem adicionar lógica para monitorar a possível exclusão ou rotação do FID. Aqui estão alguns casos em que os FIDs podem ser excluídos ou alternados:

  • Desinstalação ou reinstalação do aplicativo, por exemplo, quando um usuário final instala em um novo dispositivo.
  • O usuário final limpa o cache do aplicativo ou do dispositivo.
  • A exclusão do FID é acionada no back-end devido à inatividade do aplicativo (atualmente o limite para isso é de 270 dias de inatividade).

Quando os aplicativos passam por rotação ou exclusão de FID nesses tipos de casos, eles recebem um novo FID. Além disso, o token de autenticação de instalação associado a um FID excluído é excluído, independentemente de sua própria maturidade, e é substituído por um novo token de autenticação de instalação.

Os aplicativos podem monitorar essas mudanças e responder de acordo.

Para monitorar a rotação do FID:

Rápido

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

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

Um NSNotification denominado NSNotificationName.InstallationIDDidChange é postado no NSNotificationCenter padrão sempre que um novo FID é atribuído.

Android

Os clientes Kotlin e Java devem adicionar lógica de nova tentativa para responder em chamadas com falha para recuperar o novo FID.

JavaScript

Os aplicativos da Web podem se inscrever no gancho onIdChange .

Sempre que um novo FID é criado, o retorno de chamada inscrito é acionado:

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

Dart

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

Migrar do ID da instância para instalações do Firebase

Antes da introdução das instalações do Firebase, o Firebase contava com o Instance ID SDK para identificadores de instalações de aplicativos. As instalações do Firebase oferecem vantagens significativas em relação ao ID da instância em termos de confiabilidade, desempenho e segurança. Os aplicativos do Firebase que dependem do SDK do ID da instância devem migrar para instalações do Firebase.

O processo de migração é diferente dependendo do seu aplicativo:

  • Os aplicativos que não chamam APIs de ID de instância diretamente podem migrar atualizando suas versões do SDK . A maioria dos aplicativos Firebase se enquadra nesta categoria.

  • Os apps que fazem chamadas de API explicitamente para o ID da instância precisam atualizar as versões do SDK e fazer alterações no código para substituir os métodos do ID da instância pelas instalações do Firebase ou equivalentes do FCM. Se o seu aplicativo usar o ID da instância para recuperar tokens de registro do FCM ou usar explicitamente o ID da instância para direcionar instâncias do aplicativo ou para qualquer outra finalidade, você precisará atualizar o código do seu aplicativo.

Atualmente, o FIS é compatível com versões anteriores do identificador legado Firebase Instance ID. A exclusão de um IID é um método alternativo de solicitar a exclusão de dados com estes SDKs do Firebase:

  • iOS 6.14.0 e inferior
  • SDKs Android anteriores a 27 de fevereiro de 2020

Isso significa que os aplicativos não precisam migrar para instalações do Firebase; no entanto, fazer isso é altamente recomendado.

Como fazer upgrade para versões mínimas do SDK para instalações do Firebase

Para migrar de instalações de ID de instância para instalações do Firebase, verifique se seus aplicativos usam pelo menos os números de versão mínimos listados dos seguintes SDKs do Firebase:

SDK do Firebase Versão mínima do Android Versão mínima do iOS
Mensagens na nuvem do Firebase v20.3.0 v6.34.0
Configuração remota v19.2.0 v6.24.0
Google Analytics para Firebase \ (SDK de avaliação) v17.4.4 v6.18.0
Mensagens no aplicativo v19.0.7 v6.24.0
Monitoramento de desempenho v19.0.8 v6.21.0
Crashlytics v17.2.1 v6.23.0
Kit de aprendizado de máquina v22.1.2 v6.28.0

Atualizando código que chama explicitamente APIs de ID de instância

Se seu aplicativo Android ou Apple usa diretamente métodos SDK de ID de instância, você pode substituir esse uso por alternativas idênticas no SDK de instalações do Firebase ou no SDK FCM.

Recuperando um identificador

Os métodos para obter IDs de instância são substituídos por métodos para obter um ID de instalação. Por exemplo:

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

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

Depois

Rápido

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

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

Excluindo um identificador

Os métodos para excluir IDs de instância foram substituídos por métodos para excluir IDs de instalação do Firebase. Por exemplo:

Antes

Rápido

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

Objetivo-C

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

Android

FirebaseInstanceId.deleteInstanceId();

Depois

Rápido

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

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

Recuperando um token de registro do FCM

Antes da introdução do Firebase Installations, os clientes do FCM recuperavam tokens de registro do ID da instância. Agora, o SDK do FCM fornece métodos para recuperar o 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)"
  }
}

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

Depois

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

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