Catch up on everthing we announced at this year's Firebase Summit. Learn more

Управление установками Firebase

Служба установки Firebase (FIS) предоставляет идентификатор установки Firebase (FID) для каждого установленного экземпляра приложения Firebase. Идентификатор установки Firebase используется внутри этих служб Firebase:

Служба Firebase Функциональность установки Firebase
Обмен сообщениями Firebase Cloud

Firebase Cloud Messaging использует идентификаторы установки Firebase для целевых устройств для доставки сообщений.

Обмен сообщениями Firebase в приложении

Firebase In-App Messaging использует идентификаторы установки Firebase для целевых устройств для доставки сообщений.

Мониторинг производительности Firebase

Мониторинг производительности использует идентификаторы установки Firebase для расчета количества уникальных установок Firebase, которые обращаются к сетевым ресурсам, чтобы гарантировать, что шаблоны доступа являются достаточно анонимными. Он также использует идентификаторы установки Firebase с Firebase Remote Config для управления скоростью создания отчетов о событиях производительности.

Прогнозы Firebase

Прогнозы используют идентификаторы установки Firebase, чтобы связать установки Firebase с проектом и получить временные ряды событий. Он использует эти события для прогнозирования вероятности наступления событий, указанных клиентом, а также прогнозов расходов и оттока по умолчанию.

Google Analytics для Firebase

Google Analytics для Firebase использует данные для предоставления аналитических данных и информации об атрибуции. Собранная точная информация может зависеть от устройства и среды.

Удаленная конфигурация Firebase

Remote Config использует идентификаторы установки Firebase для выбора значений конфигурации, которые возвращаются на устройства конечных пользователей.

Firebase ML

Полномочия называемых установочными Auth маркеров используется Firebase ML для аутентификации устройства при взаимодействии с экземплярами приложений, например, для распространения моделей для разработчиков приложений для экземпляров.

Обычно службы Firebase используют службу установки Firebase, не требуя от разработчиков прямого взаимодействия с FIS API. Однако бывают случаи, когда разработчики приложений могут захотеть напрямую вызвать FIS API, например:

  • Чтобы удалить установку Firebase и данные, связанные с установкой.
  • Чтобы получить идентификаторы (идентификаторы установки Firebase), чтобы настроить таргетинг на определенные установки приложения.
  • Чтобы получить токены аутентификации установки для аутентификации установок Firebase.

Чтобы начать работу с прямым вызовом FIS API, добавьте SDK в свое приложение.

Добавьте в приложение SDK установки Firebase.

iOS +

  1. Добавить зависимость для Firebase установок к вашему Podfile:
    pod 'Firebase/Installations'
  2. Запуск pod install и откройте созданный .xcworkspace файл.
  3. Импорт модуля Firebase в вашем UIApplicationDelegate :

    Быстрый

    import Firebase

    Цель-C

    @import Firebase;
  4. Настройте FirebaseApp общей экземпляр, как правило , в вашем приложении application:didFinishLaunchingWithOptions: метод:

    Быстрый

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

    Цель-C

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

Android

Добавить зависимость для установки Firebase Android SDK для вашего модуля (приложение уровня) Gradle файл (обычно app/build.gradle ):

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

JavaScript

В зависимости от того, как организовано ваше веб - приложение, конфигурация может быть обработан автоматически или вы , возможно , потребуется обновить Firebase объект конфигурации .

Например, если ваши зависимости добавлены в index.html, добавьте зависимость в элемент <head>:

<script src="/__/firebase/9.6.0/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 с помощью вызова функции удаления на выбранном вами языке (примечание: за исключением Node.js, эти методы отражают именование идентификатора экземпляра. Однако все они фактически удаляют FID при вызове с любой текущей Firebase. SDK).

Node.js

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

admin.installations().deleteInstallation(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: { (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)")
})

Цель-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.

Процесс миграции зависит от вашего приложения:

  • Приложения , которые напрямую не называют Instance ID API , могут мигрировать обновляют свои версии SDK . Большинство приложений Firebase попадают в эту категорию.

  • Приложения , которые явно делают API вызовы к Instance ID необходимо обновить версию SDK и изменения сделать код , чтобы заменить методы Instance ID с их установками Firebase или ТСМ эквивалентов. Если ваше приложение использует идентификатор экземпляра для получения токенов регистрации FCM или явно использует идентификатор экземпляра для нацеливания экземпляров приложения или для любых других целей, вам необходимо обновить код приложения.

В настоящее время FIS обратно совместим с устаревшим идентификатором Firebase Instance ID. Удаление IID является альтернативным способом запроса удаления данных с помощью этих Firebase SDKs:

  • 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 для Firebase \ (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 или Apple напрямую использует методы 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;
  }
}];