Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

Gestire le installazioni 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 Firebase viene utilizzato internamente dai servizi Firebase come In-App Messaging o Remote Config 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, come ad esempio:

  • Per eliminare un'installazione Firebase e i dati legati all'installazione.
  • Per recuperare gli identificatori (ID di installazione di Firebase) per 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. Aggiungere la dipendenza per Firebase installazioni al vostro Podfile:
    pod 'Firebase/Installations'
  2. Eseguire pod install e aprire il creato .xcworkspace file.
  3. Importare il modulo Firebase nella vostra UIApplicationDelegate :

    Swift

    import Firebase

    Obiettivo-C

    @import Firebase;
  4. Configurare un FirebaseApp istanza condivisa, di solito in della tua app application:didFinishLaunchingWithOptions: Metodo:

    Swift

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

    Obiettivo-C

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

Android

Aggiungere la dipendenza per gli impianti Firebase Android SDK per il modulo (a livello di app) File Gradle (di solito app/build.gradle ):

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

JavaScript

A seconda di come l'applicazione web è ospitato, la configurazione può essere gestito automaticamente o potrebbe essere necessario aggiornare il vostro 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.1.3/firebase-installations.js"></script>

Eliminare un'installazione Firebase

I dati legato a un'installazione Firebase non è generalmente di identificazione personale. 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 associati a tale ID di installazione vengono rimossi dai sistemi live 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 un alto livello in Google dichiarazione sulla soppressione e la ritenzione .

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

Eliminare un FID con una chiamata API client

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

Swift

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

Giava

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

Elimina un FID con una chiamata API del server

Per eliminare un FID con una chiamata API di server, aggiungere il Firebase Admin SDK al server , se non l'hai già.

Una volta aggiunto l'SDK, elimina i FID tramite una chiamata alla funzione di eliminazione nella lingua prescelta (nota: ad eccezione di Node.js, questi metodi riflettono la denominazione dell'ID istanza. Tuttavia, in realtà eliminano tutti il ​​FID quando vengono chiamati con qualsiasi Firebase corrente SDK).

Nodo.js

// An FIDsent from a client service SDK
const idToDelete = 'eyJhbGciOiJFUzI1N_iIs5';

admin.installations().deleteInstallation(idToDelete);

Giava

// 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 Firebase con una chiamata API del server, i servizi Firebase avviano il processo per eliminare i dati associati a quell'ID di installazione, smettono di accettare nuovi dati per quell'ID nel corso di 1-2 giorni, quindi inviano una notifica all'app client che l'ID è stato cancellato. Fino a quando Firebase non invia una notifica all'app client, alcuni servizi dell'app potrebbero ancora indirizzare 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 dei clienti

Se hai l'esigenza di identificare particolari installazioni della tua app, puoi farlo recuperando l'ID di installazione di Firebase. Ad esempio, per eseguire i test durante lo sviluppo di Firebase In-App Messaging, puoi identificare e indirizzare il dispositivo di test corretto utilizzando il relativo ID di installazione Firebase.

Per recuperare un ID di installazione Firebase:

Swift

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

Giava

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

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 mirato utilizzando un token di autenticazione dell'installazione.

Un token di autorizzazione per l'installazione è un token bearer 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'associato Firebase applicazione ID ( 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 del token predefinita è di una settimana.

Per recuperare un token di autorizzazione all'installazione:

Swift

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

Giava

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

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

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

  • Disinstallazione o reinstallazione dell'app, ad esempio quando un utente finale esegue l'installazione su un nuovo dispositivo.
  • L'utente finale cancella 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 è di 270 giorni di inattività).

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

Le app possono monitorare questi cambiamenti e rispondere di conseguenza.

Per monitorare la rotazione del FID:

Swift

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

Un NSNotification chiamato NSNotificationName.InstallationIDDidChange viene inviato al default NSNotificationCenter ogni volta che viene assegnato un nuovo FID.

Android

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

JavaScript

Le applicazioni Web possono iscriversi alla onIdChange gancio.

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

Migrare dall'ID istanza alle installazioni Firebase

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

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

  • Applicazioni che non chiamare direttamente le API ID istanza possono migrare da aggiornare le loro versioni SDK . La maggior parte delle app Firebase rientra in questa categoria.

  • Le applicazioni che fanno esplicitamente chiamate API al ID istanza deve aggiornare le versioni SDK e modifiche al codice make a sostituire i metodi ID istanza con le loro installazioni Firebase o equivalenti FCM. Se la tua app usa l'ID istanza per recuperare i token di registrazione FCM o usa esplicitamente l'ID istanza per scegliere come target le istanze dell'app o per qualsiasi altro scopo, dovrai aggiornare il codice dell'applicazione.

Attualmente, FIS è retrocompatibile con l'identificatore legacy Firebase Instance ID. Eliminazione di un IID è un metodo alternativo di richiedere la cancellazione dei dati con questi Firebase SDK:

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

Ciò significa che le applicazioni non sono tenuti a migrare verso impianti Firebase; tuttavia, è altamente raccomandato.

Aggiornamento alle versioni minime dell'SDK per le installazioni Firebase

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

Firebase SDK Versione minima di Android Versione iOS minima
Messaggistica cloud Firebase v20.3.0 v6.34.0
Configurazione remota v19.2.0 v6.24.0
Google Analytics \ (SDK di misurazione) v17.4.4 v6.18.0
Messaggi 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 esplicitamente le API dell'ID istanza

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

Recupero di un identificatore

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

Prima

Swift

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

Giava

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

Swift

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

Giava

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 di istanza vengono sostituiti con i metodi per eliminare gli ID di installazione di Firebase. Per esempio:

Prima

Swift

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

Android

FirebaseInstanceId.deleteInstanceId();

Dopo

Swift

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

Obiettivo-C

- (void)deleteWithCompletion:(nonnull void (^)(NSError *_Nullable))completion;

Giava

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 di FCM fornisce metodi per recuperare il token di registrazione.

Prima

Giava

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

Swift

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

Giava

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

Swift

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