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 código de instalação do Firebase é usado internamente por estes serviços do Firebase:

Serviço do Firebase Funcionalidade de instalações do Firebase
Firebase Cloud Messaging

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

Mensagens no aplicativo do Firebase

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

Monitoramento de desempenho do Firebase

O Monitoramento de desempenho usa códigos 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 códigos 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

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

Firebase ML

As 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 armazenamento de segmentação de usuários do Firebase armazena códigos 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 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 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 qualquer outro módulo Firebase usado pelo delegado do aplicativo. Por exemplo, para usar o Cloud Firestore e a autenticação:

    Rápido

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objetivo-C

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

    Rápido

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

    Objetivo-C

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

Android

Adicione a dependência para o SDK do Android de instalações do Firebase 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.14.0/firebase-installations.js"></script>

Flutuar

  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 códigos de instalação do Firebase. Os códigos de instalação do Firebase identificam instalações de aplicativos e dados vinculados a essas instalações de aplicativos.

Quando você exclui um código de instalação, os dados vinculados a esse código de instalação são removidos dos sistemas ativos e de backup de todos os serviços do Firebase que usam códigos de instalação do Firebase para identificar instalações em até 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 cria 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 de forma alguma ao ID ou aos dados anteriores.

Excluir um FID com uma chamada de API do cliente

Para excluir FIDs gerados pelos serviços do Firebase, chame o método apropriado do 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");
}

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

Excluir um FID com uma chamada de API do servidor

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

Depois que o SDK for adicionado, exclua os FIDs por meio de uma chamada à função de exclusão no idioma de sua escolha (observação: exceto Node.js, esses métodos refletem a nomenclatura do ID da instância. No entanto, todos eles 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 ou 2 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 podem segmentar 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á fazer isso 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 o 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)")
}

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 o 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) que contém as seguintes informações para uma instalação:

  • O código de instalação do Firebase
  • O projeto associado ( projectNumber )
  • O ID do aplicativo do 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. A vida útil do token padrão é 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)")
})

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

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

Monitorar o ciclo de vida do código de instalação do Firebase

Durante a operação normal de um aplicativo, os IDs de instalação do Firebase (FIDs) não exigem monitoramento especial. No entanto, os aplicativos que recuperam e usam explicitamente FIDs 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 rotacionados:

  • 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 pela rotação ou exclusão do 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 adequadamente.

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

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 chamado 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 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 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 Instance ID 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 Instance ID em confiabilidade, desempenho e segurança. Os aplicativos do Firebase que dependem do SDK do Instance ID 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 fazem chamadas de API explicitamente para o Instance ID precisam atualizar as versões do SDK e fazer alterações no código para substituir os métodos do Instance ID pelas instalações do Firebase ou equivalentes do FCM. Se seu aplicativo usa o Instance ID para recuperar tokens de registro do FCM ou usa explicitamente o Instance ID para direcionar instâncias do aplicativo ou para qualquer outra finalidade, você precisará atualizar o código do 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 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 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 do Instance ID 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
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 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 do 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ções. Por exemplo:

Antes da

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

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

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 são substituídos por métodos para excluir IDs de instalação do Firebase. Por exemplo:

Antes da

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 das instalações do Firebase, 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 da

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