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+
- Adicione a dependência para instalações do Firebase ao seu Podfile:
pod 'FirebaseInstallations'
- Execute
pod install
e abra o arquivo.xcworkspace
criado. - Importe o módulo
FirebaseCore
em seuUIApplicationDelegate
, 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; // ...
- Configure uma instância compartilhada
FirebaseApp
no métodoapplication(_: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];
- Se estiver usando SwiftUI, você deve criar um delegado de aplicativo e anexá-lo à estrutura
App
por meio deUIApplicationDelegateAdaptor
ouNSApplicationDelegateAdaptor
. 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
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
Reconstrua seu projeto:
flutter run
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; } }];