O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Gerenciar instalações do Firebase

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

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
Firebase Cloud Messaging

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

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

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

Firebase ML

Credenciais chamadas de 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 do FIS. No entanto, há casos em que os desenvolvedores de aplicativos podem querer chamar diretamente a API do 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íficos.
  • Para recuperar tokens de autenticação de instalação para autenticar as 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 a pod install e abra o arquivo .xcworkspace criado.
  3. Importe o módulo FirebaseCore em seu UIApplicationDelegate , bem como quaisquer outros módulos Firebase usados ​​pelo delegado do aplicativo. Por exemplo, para usar Cloud Firestore e autenticação:

    SwiftUI

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

    Rápido

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objective-C

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

    SwiftUI

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

    Rápido

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

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  5. Se você estiver usando SwiftUI, deverá criar um delegado de aplicativo e anexá-lo à sua estrutura de App por meio de UIApplicationDelegateAdaptor ou NSApplicationDelegateAdaptor . Você também deve desativar o swizzling de delegado de 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.1.0'

JavaScript

Dependendo de como seu aplicativo da 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/9.16.0/firebase-installations.js"></script>

vibrar

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

    flutter pub add firebase_app_installations
    
  2. Reconstrua seu projeto:

    flutter run
    
  3. Importe o plug-in 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 são de identificação pessoal. 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; diferentes aplicativos no mesmo dispositivo têm diferentes IDs de instalação do Firebase. 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 180 dias. Esse processo é descrito em alto nível na declaração do Google sobre exclusão e retenção .

A menos que você desabilite todos os serviços geradores 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.

Excluir um FID com uma chamada de API do cliente

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

Rápido

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

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

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

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 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 1 a 2 dias e, em seguida, notificam o aplicativo cliente que o ID foi deletado. Até que o Firebase notifique o aplicativo cliente, alguns dos serviços do aplicativo ainda podem direcionar o ID, por exemplo, uma instalação do Firebase pode 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 novo ID 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á fazê-lo recuperando o ID de instalação do Firebase. Por exemplo, para realizar testes durante o desenvolvimento do Firebase In-App Messaging, você pode identificar e direcionar o dispositivo de teste correto usando seu ID de instalação do Firebase.

Para recuperar um ID de instalação do 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)")
}

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

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

Os serviços do Firebase podem autenticar as 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 de destino 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) contendo 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 expiração do token

Um token de autenticação de instalação não pode ser revogado e permanece válido até sua data de expiração. O tempo de vida padrão do token é de uma semana.

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

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

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

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

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 girados:

  • 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 experimentam 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 alterações 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
  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];
}];

Uma NSNotification chamada NSNotificationName.InstallationIDDidChange é postada no NSNotificationCenter padrão sempre que um novo FID é atribuído.

Android

Os clientes Kotlin e Java devem adicionar lógica de repetição para responder a 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 callback assinado é 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 de ID de 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 sobre o Instance ID em termos de confiabilidade, desempenho e segurança. Os aplicativos do Firebase que dependem do Instance ID SDK devem migrar para as instalações do Firebase.

O processo de migração é diferente com base no 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 do Firebase se enquadra nessa categoria.

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

Atualmente, o FIS é compatível com o identificador herdado Firebase Instance ID. A exclusão de um IID é um método alternativo de solicitação de exclusão de dados com estes SDKs do Firebase:

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

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

Atualizando para versões mínimas do SDK para instalações do Firebase

Para migrar do Instance ID para as instalações do Firebase, certifique-se de que seus aplicativos usem pelo menos os números mínimos de versão listados dos seguintes SDKs do Firebase:

SDK do Firebase Versão mínima do Android Versão mínima do iOS
Firebase Cloud Messaging v20.3.0 v6.34.0
Configuração Remota v19.2.0 v6.24.0
Google Analytics para Firebase \ (SDK de mediçã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 ML v22.1.2 v6.28.0

Atualização de código que chama APIs de ID de instância explicitamente

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

Recuperando um identificador

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

Antes de

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

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

Depois de

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

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

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 de

Rápido

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

Depois de

Rápido

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

Recuperando um token de registro do FCM

Antes da introdução das instalações do Firebase, os clientes do FCM recuperavam tokens de registro do ID da instância. Agora, o FCM SDK fornece métodos para recuperar o token de registro.

Antes de

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

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

Depois de

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

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