В какое время меняется токен приложения firebase и как его управлять?

Я новичок в firebase. Я изучаю его, как малыша, учащегося ходить. До сих пор мне удалось отправить сообщение на свой собственный телефон, используя токен, сгенерированный для моего телефона фреймом firebase. Теперь здесь, где это становится сложно (на мой взгляд). В расширенной службе FirebaseInstanceIdService существует метод, называемый onTokenRefresh(). Поскольку он называется refresh, то я предполагаю, что он изменится. Я хочу знать, когда создается этот токен и когда он будет изменен?

И если он изменится, предположим, что я отправляю сообщение на устройство с токеном "А", который сейчас отключен, поэтому он будет поставлен в очередь. Теперь, когда устройство подключится к сети, оно "обновит" токен до "B". Теперь, когда сообщение должно было быть доставлено в токен "А", сообщение никогда не будет доставлено. Как я могу управлять этой ситуацией?

Ответ 1

Маркер генерируется после запуска приложения, как только телефон может подключиться к серверам Google. Из-за необходимой возможности подключения это может произойти не сразу, но в большинстве случаев это произойдет через несколько секунд после того, как пользователь откроет приложение. Как только маркер генерируется, onTokenRefresh() метод onTokenRefresh().

Как вы указали, токен может измениться, и в этом случае onTokenRefresh() будет вызываться метод onTokenRefresh().
Событие обновления как-то редка, не ожидайте увидеть его вообще.

Когда происходит токен обновления, все сообщения, которые были успешно отправлены (API возвратил вам идентификатор сообщения) на старый токен, будут доставлены.

Наконец, даже после того, как произошло обновление, старый токен все равно будет работать в течение короткого периода времени, чтобы приложение могло передавать новый токен в его исходный код.

Ответ 2

При первом запуске вашего приложения sdk из FCM генерирует регистрационный токен для экземпляра клиентского приложения. Как сказано выше, это редкое событие. Чтобы быть конкретным, токен регистрации может измениться, если:

  • Приложение удаляет идентификатор экземпляра.
  • Приложение восстановлено на новом устройстве
  • Пользователь удаляет/переустанавливает приложение.
  • Пользователь очищает данные приложения.

Идентификатор экземпляра предоставляет уникальный идентификатор для каждого экземпляра вашего приложения. Идентификатор объекта предоставляет простой API для создания токенов безопасности, которые разрешают третьим лицам получать доступ к управляемым ресурсам на стороне сервера приложений. Сервер экземпляра может даже сказать вам, когда устройство, на котором ваше приложение был использован последним. Мы можем использовать это, чтобы решить, следует ли хранить данные из приложения или отправлять push-сообщение для повторного взаимодействия с пользователями.

Каждый раз, когда токен устройства изменяется, он отражается в методе onTokenRefresh(). Для получения маркера устройства при его изменении мы можем вызвать этот метод, чтобы получить обновленный токен.

и для получения токена устройства в любой момент мы можем использовать метод FirebaseInstanceId.getInstance(). getToken() для получения текущего токена устройства. Для получения токена устройства требуется немного времени.

Нажмите здесь, чтобы узнать больше о доступе к маркеру регистрации устройства.

Ответ 3

  • onTokenRefresh() и FirebaseInstanceIdService устарели.
  • Этот вызов также не рекомендуется использовать FirebaseInstanceId.getInstance(). GetToken()

Вместо этого вы должны переопределить onNewToken (String token) в FirebaseMessagingService. Этот метод срабатывает при смене токена. Переопределив этот метод, вы можете безопасно удалить FirebaseInstanceIdService, который содержит onTokenRefresh().

Когда токен может измениться?

  • Приложение удаляет идентификатор экземпляра
  • Приложение восстановлено на новом устройстве
  • Пользователь удаляет/переустанавливает приложение
  • Пользователь очищает данные приложения

Как получить текущий токен:

вызывая FirebaseInstanceId.getInstance(). getInstanceId():

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

Для получения дополнительной информации: https://firebase.google.com/docs/cloud-messaging/android/client