Служба установки Firebase (FIS) предоставляет идентификатор установки Firebase (FID) для каждого установленного экземпляра приложения Firebase. Идентификатор установки Firebase используется внутренними службами Firebase, такими как обмен сообщениями в приложении или удаленная конфигурация, не требуя от разработчиков прямого взаимодействия с FIS API. Однако бывают случаи, когда разработчики приложений могут захотеть напрямую вызвать FIS API, например:
- Чтобы удалить установку Firebase и данные, связанные с установкой.
- Чтобы получить идентификаторы (идентификаторы установки Firebase), чтобы настроить таргетинг на определенные установки приложения.
- Чтобы получить токены аутентификации установки для аутентификации установок Firebase.
Чтобы начать работу с прямым вызовом FIS API, добавьте SDK в свое приложение.
Добавьте в приложение SDK установки Firebase.
iOS
- Добавьте зависимость для установок Firebase в свой Podfile:
pod 'Firebase/Installations'
- Запустите
pod install
и откройте созданный файл.xcworkspace
. - Импортируйте модуль Firebase в свой
UIApplicationDelegate
:Быстрый
import Firebase
Цель-C
@import Firebase;
- Настройте общий экземпляр
FirebaseApp
, как правило, в методеapplication:didFinishLaunchingWithOptions:
вашего приложения:Быстрый
// Use Firebase library to configure APIs FirebaseApp.configure()
Цель-C
// Use Firebase library to configure APIs [FIRApp configure];
Android
Добавьте зависимость для Android SDK для установки Firebase в файл Gradle модуля (уровня приложения) (обычно app/build.gradle
):
implementation 'com.google.firebase:firebase-installations:16.3.5'
JavaScript
В зависимости от того, как размещено ваше веб-приложение, ваша конфигурация может обрабатываться автоматически или вам может потребоваться обновить объект конфигурации Firebase .
Например, если ваши зависимости добавлены в index.html, добавьте зависимость в элемент <head>:
<script src="/__/firebase/8.4.1/firebase-installations.js"></script>
Удалить установку Firebase
Данные, связанные с установкой Firebase, обычно не идентифицируют личность. Тем не менее, может быть полезно дать пользователям возможность управлять этими данными и удалять их.
Идентификаторы установки Firebase различны для каждой установки каждого приложения; разные приложения на одном устройстве имеют разные идентификаторы установки Firebase. Идентификаторы установки Firebase идентифицируют установки приложений и данные, связанные с этими установками.
Когда вы удаляете идентификатор установки, данные, связанные с этим идентификатором установки, удаляются из действующих и резервных систем всех служб Firebase, которые используют идентификаторы установки Firebase для идентификации установок в течение 180 дней. Этот процесс подробно описан в заявлении Google об удалении и хранении .
Если вы не отключите все службы создания FID в своем приложении, FIS создаст новый идентификатор в течение нескольких дней. Firebase считает вновь созданный идентификатор новой установкой Firebase и никоим образом не связывает его с предыдущим идентификатором или данными.
Удалить FID с помощью вызова клиентского API
Чтобы удалить FID, созданные службами Firebase, вызовите соответствующий метод из SDK установки Firebase:
Быстрый
Installations.installations().delete { error in if let error = error { print("Error deleting installation: \(error)") return } print("Installation deleted"); }
Цель-C
[[FIRInstallations installations] deleteWithCompletion:^(NSError *error) { if (error != nil) { NSLog(@"Error deleting Installation %@", error); return; } NSLog(@"Installation deleted"); }];
Ява
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"); } } });
Котлин + 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();
Удалить FID с помощью вызова API сервера
Чтобы удалить FID с помощью вызова API сервера, добавьте на свой сервер Firebase Admin SDK , если вы еще этого не сделали.
После добавления SDK удалите FID с помощью вызова функции удаления на выбранном вами языке (примечание: хотя эти методы отражают именование идентификаторов экземпляров, они фактически удаляют FID при вызове с любым текущим SDK Firebase).
Node.js
// An FID sent from a client service SDK
const idToDelete = 'eyJhbGciOiJFUzI1N_iIs5';
admin.instanceId().deleteInstanceId(idToDelete);
Ява
// An FID sent from a client service SDK
String idToDelete = "eyJhbGciOiJFUzI1N_iIs5";
FirebaseInstanceId.getInstance().deleteInstanceIdAsync(idToDelete).get();
Python
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)
Идти
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)
}
Когда вы удаляете идентификатор установки Firebase с помощью вызова API сервера, службы Firebase запускают процесс удаления данных, связанных с этим идентификатором установки, прекращают прием новых данных для этого идентификатора в течение 1-2 дней, а затем уведомляют клиентское приложение. что идентификатор был удален. Пока Firebase не уведомит клиентское приложение, некоторые службы приложения могут по-прежнему нацеливаться на идентификатор - например, установка Firebase может продолжать получать уведомления FCM в течение нескольких часов.
Если вы хотите удалить текущий идентификатор установки Firebase и немедленно использовать службы Firebase с новым, несвязанным идентификатором, используйте клиентский API для обработки удаления.
Получить идентификаторы клиентов
Если у вас есть требование идентифицировать определенные установки вашего приложения, вы можете сделать это, получив идентификатор установки Firebase. Например, чтобы выполнить тестирование во время разработки Firebase In-App Messaging, вы можете определить и настроить таргетинг на правильное тестовое устройство, используя его установочный идентификатор Firebase.
Чтобы получить идентификатор установки Firebase:
Быстрый
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)") }
Цель-C
[[FIRInstallations installations] installationIDWithCompletion:^(NSString *identifier, NSError *error) { if (error != nil) { NSLog(@"Error fetching Installation ID %@", error); return; } NSLog(@"Installation ID: %@", identifier); }];
Ява
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"); } } });
Котлин + 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);
Получить токены аутентификации установки
Сервисы Firebase могут аутентифицировать установки Firebase с помощью токенов аутентификации, полученных из FIS. Например, при разработке A / B-тестов для Remote Config вы можете аутентифицировать целевое тестовое устройство с помощью установочного токена аутентификации.
Токен аутентификации установки - это недолговечный токен-носитель в формате веб-токена JSON (JWT), содержащий следующую информацию для установки:
- Идентификатор установки Firebase
- Связанный проект (
projectNumber
) - Связанный идентификатор приложения Firebase (
appId
) - Срок действия токена
Установочный токен аутентификации не может быть отозван и остается действительным до истечения срока его действия. Срок службы токена по умолчанию - одна неделя.
Чтобы получить токен аутентификации установки:
Быстрый
Installations.installations().authTokenForcingRefresh(true, completion: { (token, error) in if let error = error { print("Error fetching token: \(error)") return } guard let token = token else { return } print("Installation auth token: \(token)") })
Цель-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]); }];
Ява
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"); } } });
Котлин + 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);
Отслеживайте жизненный цикл идентификатора установки Firebase
Во время нормальной работы приложения идентификаторы установки Firebase (FID) не требуют особого контроля. Однако приложения, которые явно извлекают и используют FID, должны добавить логику для отслеживания потенциального удаления или ротации FID. Вот несколько случаев, когда FID могут быть удалены или повернуты:
- Удаление или повторная установка приложения, например, когда конечный пользователь устанавливает на новое устройство.
- Конечный пользователь очищает кеш приложения или устройства.
- Удаление FID запускается в серверной части из-за неактивности приложения (в настоящее время порог для этого составляет 270 дней бездействия).
Когда в приложениях происходит ротация или удаление FID в таких случаях, им назначается новый FID. Кроме того, токен аутентификации установки, связанный с удаленным FID, удаляется независимо от его срока действия и заменяется новым токеном аутентификации установки.
Приложения могут отслеживать эти изменения и соответствующим образом реагировать.
Чтобы контролировать вращение ПИД:
Быстрый
installationIDObserver = NotificationCenter.default.addObserver( forName: .InstallationIDDidChange, object: nil, queue: nil ) { (notification) in // Fetch new Installation ID self.fetchInstallationToken() }
Цель-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]; }];
NSNotification с именем NSNotificationName.InstallationIDDidChange
отправляется в NSNotificationCenter по умолчанию всякий раз, когда назначается новый FID.
Android
Клиенты Kotlin и Java должны добавить логику повтора для ответа на неудачные вызовы для получения нового FID.
JavaScript
Веб-приложения могут подписаться на onIdChange
.
Каждый раз, когда создается новый FID, запускается обратный вызов с подпиской:
await firebase.installations().onIdChange((newId) => { console.log(newId); // TODO: Handle new installation ID. });
Переход с идентификатора экземпляра на установки Firebase
До внедрения установок Firebase Firebase полагалась на SDK идентификатора экземпляра для идентификаторов установок приложений. Установки Firebase обеспечивают значительные преимущества по сравнению с Instance ID в надежности, производительности и безопасности. Приложения Firebase, зависящие от SDK идентификатора экземпляра, должны перейти на установки Firebase.
Процесс миграции зависит от вашего приложения:
Приложения, которые не вызывают напрямую API идентификатора экземпляра, могут переноситься путем обновления своих версий SDK . Большинство приложений Firebase попадают в эту категорию.
Приложения, которые явно вызывают API-вызовы к идентификатору экземпляра, должны обновлять версии SDK и вносить изменения в код, чтобы заменить методы идентификатора экземпляра их установками Firebase или эквивалентами FCM. Если ваше приложение использует идентификатор экземпляра для получения токенов регистрации FCM или явно использует идентификатор экземпляра для нацеливания экземпляров приложения или для любых других целей, вам необходимо обновить код приложения.
В настоящее время FIS обратно совместим с устаревшим идентификатором Firebase Instance ID. Удаление IID - это альтернативный метод запроса удаления данных с помощью этих SDK Firebase:
- iOS 6.14.0 и ниже
- SDK для Android до 27 февраля 2020 г.
Это означает, что приложения не требуется переносить на установки Firebase; однако это настоятельно рекомендуется.
Обновление до минимальных версий SDK для установок Firebase
Чтобы перейти с идентификатора экземпляра на установки Firebase, убедитесь, что ваши приложения используют по крайней мере указанные минимальные номера версий следующих пакетов SDK Firebase:
Firebase SDK | Минимальная версия Android | Минимальная версия iOS |
Обмен сообщениями Firebase Cloud | Версия 20.3.0 | v6.34.0 |
Удаленная конфигурация | v19.2.0 | v6.24.0 |
Google Analytics \ (SDK измерения) | Версия 17.4.4 | Версия 6.18.0 |
Обмен сообщениями в приложении | v19.0.7 | v6.24.0 |
Мониторинг производительности | v19.0.8 | v6.21.0 |
Crashlytics | Версия 17.2.1 | v6.23.0 |
Комплект ML | Версия 22.1.2 | Версия 6.28.0 |
Обновление кода, который явно вызывает API идентификатора экземпляра
Если ваше приложение для Android или iOS напрямую использует методы SDK идентификатора экземпляра, вы можете заменить это использование аналогичными альтернативами в SDK установки Firebase или FCM SDK.
Получение идентификатора
Методы получения идентификаторов экземпляров заменены методами получения идентификаторов установок. Например:
Перед
Быстрый
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)" } }
Цель-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; } }];
Ява
FirebaseInstanceId.getInstance().getInstanceId() .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() { @Override public void onComplete(@NonNull Task<InstanceIdResult> task) { Log.d("IID_TOKEN", task.getResult().getToken()); } });
Котлин + KTX
FirebaseInstanceId.getInstance().instanceId .addOnSuccessListener { result -> Log.d("IID_TOKEN", result.token) }
После
Быстрый
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)") }
Цель-C
[[FIRInstallations installations] installationIDWithCompletion:^(NSString *identifier, NSError *error) { if (error != nil) { NSLog(@"Error fetching Installation ID %@", error); return; } NSLog(@"Installation ID: %@", identifier); }];
Ява
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"); } } });
Котлин + 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") } }
Удаление идентификатора
Методы удаления идентификаторов экземпляров заменены методами удаления идентификаторов установки Firebase. Например:
Перед
Быстрый
InstanceID.instanceID().deleteID { error in
if let error = error {
print("Error deleting instance ID: \(error)")
}
}
Цель-C
[FIRInstanceID instanceID] deleteIDWithHandler:^(NSError *error) {
if error != nil {
NSLog(@"Error deleting instance ID: %@", error);
}
}];
Android
FirebaseInstanceId.deleteInstanceId();
После
Быстрый
func delete(completion: @escaping (Error?) -> Void)
Цель-C
- (void)deleteWithCompletion:(nonnull void (^)(NSError *_Nullable))completion;
Ява
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"); } } });
Котлин + KTX
FirebaseInstallations.getInstance().delete().addOnCompleteListener { task -> if (task.isComplete) { Log.d("Installations", "Installation deleted") } else { Log.e("Installations", "Unable to delete Installation") } }
Получение регистрационного токена FCM
До появления Firebase Installations клиенты FCM получали регистрационные токены из идентификатора экземпляра. Теперь FCM SDK предоставляет методы для получения регистрационного токена.
Перед
Ява
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(); } });
Котлин + 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() })
Быстрый
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)" } }
Цель-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; } }];
После
Ява
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(); } });
Котлин + 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() })
Быстрый
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)" } }
Цель-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; } }];