Gestisci le installazioni di Firebase

Il servizio di installazione Firebase (FIS) fornisce un ID installazione Firebase (FID) per ogni istanza installata di un'app Firebase. L'ID di installazione di Firebase viene utilizzato internamente da questi servizi Firebase:

Servizio Firebase Funzionalità di installazione di Firebase
Messaggistica cloud di Firebase

Firebase Cloud Messaging utilizza gli ID di installazione Firebase per indirizzare i dispositivi per la consegna dei messaggi.

Messaggistica in-app di Firebase

La messaggistica in-app di Firebase utilizza gli ID di installazione di Firebase per indirizzare i dispositivi per la consegna dei messaggi.

Monitoraggio delle prestazioni di Firebase

Performance Monitoring utilizza gli ID di installazione Firebase per calcolare il numero di installazioni Firebase univoche che accedono alle risorse di rete, per garantire che i modelli di accesso siano sufficientemente anonimi. Utilizza inoltre gli ID di installazione Firebase con Firebase Remote Config per gestire il tasso di segnalazione degli eventi sulle prestazioni.

Google Analytics per Firebase

Google Analytics per Firebase utilizza i dati per fornire informazioni analitiche e di attribuzione. Le informazioni precise raccolte possono variare in base al dispositivo e all'ambiente.

Configurazione remota Firebase

Remote Config utilizza gli ID di installazione Firebase per selezionare i valori di configurazione da restituire ai dispositivi degli utenti finali.

Firebase ML

Le credenziali denominate token di autenticazione dell'installazione vengono utilizzate da Firebase ML per l'autenticazione del dispositivo durante l'interazione con le istanze dell'app, ad esempio per distribuire i modelli per sviluppatori alle istanze dell'app.

In genere, i servizi Firebase utilizzano il servizio di installazione Firebase senza richiedere agli sviluppatori di interagire direttamente con l'API FIS. Tuttavia, ci sono casi in cui gli sviluppatori di app potrebbero voler chiamare direttamente l'API FIS, ad esempio:

  • Per eliminare un'installazione Firebase e i dati legati all'installazione.
  • Per recuperare gli identificatori (ID di installazione di Firebase) al fine di indirizzare installazioni di app specifiche.
  • Per recuperare i token di autenticazione dell'installazione per autenticare le installazioni Firebase.

Per iniziare a chiamare direttamente l'API FIS, aggiungi l'SDK alla tua app.

Aggiungi l'SDK di installazione di Firebase alla tua app

iOS+

  1. Aggiungi la dipendenza per le installazioni Firebase al tuo Podfile:
    pod 'FirebaseInstallations'
  2. Esegui pod install e apri il file .xcworkspace creato.
  3. Importa il modulo FirebaseCore nel tuo UIApplicationDelegate , così come qualsiasi altro modulo Firebase utilizzato dal delegato dell'app. Ad esempio, per utilizzare Cloud Firestore e l'autenticazione:

    Veloce

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Obiettivo-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  4. Configura un'istanza condivisa FirebaseApp , in genere nell'inizializzatore App o nel metodo dell'applicazione del delegato application(_:didFinishLaunchingWithOptions:) :

    Veloce

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

    Obiettivo-C

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

Androide

Aggiungi la dipendenza per le installazioni di Firebase SDK Android al file Gradle del tuo modulo (a livello di app (di solito app/build.gradle ):

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

JavaScript

A seconda di come è ospitata la tua applicazione web, la tua configurazione potrebbe essere gestita automaticamente o potresti dover aggiornare il tuo oggetto di configurazione Firebase .

Ad esempio, se le tue dipendenze vengono aggiunte in index.html, aggiungi la dipendenza nell'elemento <head>:

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

Svolazzare

  1. Dalla directory principale del tuo progetto Flutter, esegui il seguente comando per installare il plug-in di installazione di Firebase:

    flutter pub add firebase_app_installations
    
  2. Ricostruisci il tuo progetto:

    flutter run
    
  3. Importa il plug-in di installazione di Firebase:

    import 'package:firebase_app_installations/firebase_app_installations.dart';
    

Elimina un'installazione di Firebase

I dati legati a un'installazione Firebase generalmente non sono identificativi personali. Tuttavia, può essere utile offrire agli utenti un'opzione per gestire ed eliminare questi dati.

Gli ID di installazione di Firebase sono diversi per ogni installazione di ogni applicazione; applicazioni diverse sullo stesso dispositivo hanno ID di installazione Firebase diversi. Gli ID di installazione di Firebase identificano le installazioni di app e i dati legati a tali installazioni di app.

Quando elimini un ID di installazione, i dati legati a tale ID di installazione vengono rimossi dai sistemi attivi e di backup di tutti i servizi Firebase che utilizzano gli ID di installazione Firebase per identificare le installazioni entro 180 giorni. Questo processo è descritto ad alto livello nella dichiarazione di Google sull'eliminazione e la conservazione .

A meno che non disabiliti tutti i servizi che generano FID nella tua app, FIS crea un nuovo ID entro pochi giorni. Firebase considera l'ID appena creato come una nuova installazione Firebase e non lo associa in alcun modo all'ID o ai dati precedenti.

Elimina un FID con una chiamata API client

Per eliminare i FID generati dai servizi Firebase, chiama il metodo appropriato dall'SDK di installazioni Firebase:

Veloce

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

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

Elimina un FID con una chiamata API del server

Per eliminare un FID con una chiamata API del server, aggiungi Firebase Admin SDK al tuo server , se non l'hai già fatto.

Una volta aggiunto l'SDK, elimina i FID tramite una chiamata alla funzione di eliminazione nella lingua di tua scelta (nota: ad eccezione di Node.js, questi metodi riflettono la denominazione dell'ID istanza. Tuttavia, eliminano tutti effettivamente il FID quando vengono chiamati con qualsiasi Firebase corrente 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();

Pitone

  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)

andare

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 elimini un ID di installazione di Firebase con una chiamata API del server, i servizi Firebase avviano il processo per eliminare i dati legati a tale ID di installazione, smettono di accettare nuovi dati per quell'ID nel corso di 1-2 giorni, quindi avvisano l'app client che l'ID è stato cancellato. Fino a quando Firebase non notificherà l'app client, alcuni dei servizi dell'app potrebbero ancora avere come target l'ID, ad esempio, un'installazione Firebase potrebbe continuare a ricevere notifiche FCM per alcune ore.

Se desideri eliminare l'ID di installazione Firebase corrente e utilizzare immediatamente i servizi Firebase con un nuovo ID non correlato, utilizza l'API client per gestire l'eliminazione.

Recupera gli identificatori del cliente

Se hai la necessità di identificare installazioni particolari della tua app, puoi farlo recuperando l'ID di installazione di Firebase. Ad esempio, per eseguire test durante lo sviluppo della messaggistica in-app Firebase, puoi identificare e indirizzare il dispositivo di test corretto utilizzando il relativo ID di installazione Firebase.

Per recuperare un ID installazione Firebase:

Veloce

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

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

Recupera i token di autenticazione dell'installazione

I servizi Firebase possono autenticare le installazioni Firebase con i token di autenticazione recuperati da FIS. Ad esempio, quando si progettano test A/B per Remote Config, è possibile autenticare un dispositivo di test di destinazione utilizzando un token di autenticazione dell'installazione.

Un token di autenticazione dell'installazione è un token di trasporto di breve durata in formato JSON Web token (JWT) contenente le seguenti informazioni per un'installazione:

  • L'ID di installazione di Firebase
  • Il progetto associato ( projectNumber )
  • L'ID dell'applicazione Firebase associata ( appId )
  • La data di scadenza del token

Un token di autenticazione dell'installazione non può essere revocato e rimane valido fino alla data di scadenza. La durata predefinita del token è di una settimana.

Per recuperare un token di autenticazione dell'installazione:

Veloce

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

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

Monitora il ciclo di vita dell'ID di installazione di Firebase

Durante il normale funzionamento di un'app, gli ID di installazione di Firebase (FID) non richiedono un monitoraggio speciale. Tuttavia, le app che recuperano e utilizzano in modo esplicito i FID dovrebbero aggiungere la logica per monitorare la potenziale eliminazione o rotazione del FID. Di seguito sono riportati alcuni casi in cui i FID potrebbero essere eliminati o ruotati:

  • Disinstallazione o reinstallazione dell'app, ad esempio quando un utente finale installa su un nuovo dispositivo.
  • L'utente finale svuota la cache dell'app o del dispositivo.
  • L'eliminazione del FID viene attivata nel back-end a causa dell'inattività dell'app (attualmente la soglia per questo è di 270 giorni di inattività).

Quando le app subiscono la rotazione o l'eliminazione del FID in questi tipi di casi, viene loro assegnato un nuovo FID. Inoltre, il token di autenticazione dell'installazione associato a un FID eliminato viene eliminato, indipendentemente dalla sua maturità, e viene sostituito con un nuovo token di autenticazione dell'installazione.

Le app possono monitorare queste modifiche e rispondere di conseguenza.

Per monitorare la rotazione FID:

Veloce

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

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

Una notifica NS denominata NSNotificationName.InstallationIDDidChange viene pubblicata nel NSNotificationCenter predefinito ogni volta che viene assegnato un nuovo FID.

Androide

I client Kotlin e Java dovrebbero aggiungere la logica dei tentativi per rispondere alle chiamate non riuscite per recuperare il nuovo FID.

JavaScript

Le app Web possono iscriversi onIdChange .

Ogni volta che viene creato un nuovo FID, viene attivata la richiamata sottoscritta:

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

Dart

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

Migra dall'ID istanza alle installazioni di Firebase

Prima dell'introduzione delle installazioni di Firebase, Firebase si basava sull'SDK di ID istanza per gli identificatori delle installazioni di app. Le installazioni Firebase offrono vantaggi significativi rispetto all'Instance ID in termini di affidabilità, prestazioni e sicurezza. Le app Firebase che dipendono dall'SDK di ID istanza devono migrare alle installazioni Firebase.

Il processo di migrazione è diverso in base alla tua app:

  • Le app che non chiamano direttamente le API di ID istanza possono migrare aggiornando le versioni dell'SDK . La maggior parte delle app Firebase rientra in questa categoria.

  • Le app che effettuano esplicitamente chiamate API all'ID istanza devono aggiornare le versioni dell'SDK e apportare modifiche al codice per sostituire i metodi dell'ID istanza con le relative installazioni Firebase o equivalenti FCM. Se la tua app utilizza l'ID istanza per recuperare i token di registrazione FCM o utilizza esplicitamente l'ID istanza per indirizzare le istanze dell'app o per qualsiasi altro scopo, dovrai aggiornare il codice dell'applicazione.

Attualmente, FIS è compatibile con le versioni precedenti dell'identificatore legacy ID istanza Firebase. L'eliminazione di un IID è un metodo alternativo per richiedere l'eliminazione dei dati con questi SDK Firebase:

  • iOS 6.14.0 e versioni precedenti
  • SDK Android precedenti al 27 febbraio 2020

Ciò significa che le app non devono migrare alle installazioni di Firebase; tuttavia, è altamente raccomandato farlo.

Aggiornamento alle versioni minime dell'SDK per le installazioni Firebase

Per migrare dall'ID istanza alle installazioni Firebase, assicurati che le tue applicazioni utilizzino almeno i numeri di versione minimi elencati dei seguenti SDK Firebase:

SDK Firebase Versione Android minima Versione iOS minima
Messaggistica cloud di Firebase v20.3.0 v6.34.0
Configurazione remota v19.2.0 v6.24.0
Google Analytics per Firebase \ (SDK di misurazione) v17.4.4 v6.18.0
Messaggistica in-app v19.0.7 v6.24.0
Monitoraggio delle prestazioni v19.0.8 v6.21.0
Crashlytics v17.2.1 v6.23.0
Kit ML v22.1.2 v6.28.0

Aggiornamento del codice che chiama in modo esplicito le API di ID istanza

Se la tua app Android o Apple utilizza direttamente i metodi dell'SDK di ID istanza, puoi sostituire tale utilizzo con alternative identiche nell'SDK di installazione di Firebase o nell'SDK di FCM.

Recupero di un identificatore

I metodi per ottenere gli ID istanza vengono sostituiti con metodi per ottenere un ID di installazione. Per esempio:

Prima di

Veloce

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

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

Dopo

Veloce

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

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

Eliminazione di un identificatore

I metodi per eliminare gli ID istanza vengono sostituiti con metodi per eliminare gli ID installazione Firebase. Per esempio:

Prima di

Veloce

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

Obiettivo-C

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

Androide

FirebaseInstanceId.deleteInstanceId();

Dopo

Veloce

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

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

Recupero di un token di registrazione FCM

Prima dell'introduzione delle installazioni Firebase, i client FCM recuperavano i token di registrazione dall'ID istanza. Ora, l'SDK FCM fornisce metodi per recuperare il token di registrazione.

Prima di

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

Veloce

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

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

Dopo

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

Veloce

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

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