FCM имеет два активных токена для одного и того же клиента Javascript

Я использую Firebase Javascript SDK для добавления веб-push-уведомлений в приложение React JS. В результате некоторой последовательности событий мы получили два токена FCM, которые, по-видимому, принадлежат одному и тому же веб-клиенту (одному и тому же компьютеру, браузеру и домену сайта). Сообщение FCM, отправленное на любой токен, получено на клиенте. Я ожидал, что один из токенов будет признан недействительным, но, похоже, это не так. Можно ли идентифицировать и удалить посторонний токен при возникновении такой ситуации?

Код для регистрации нашего сервисного работника и отправки токена FCM в наш бэкэнд-сервис выглядит следующим образом:

firebase.initializeApp(Config.firebase);
this.messaging = firebase.messaging();
this.setupNotifications(this.messaging, this.loadAlerts.bind(this));

setupNotifications(messaging, handler) {
 let _this = this;
    if ('serviceWorker' in navigator) {
        navigator.serviceWorker.register('./sw/firebase-messaging-sw.js')
            .then(function(registration) {
                registration.update();
    _this.messaging.useServiceWorker(registration);
    Notification.requestPermission().then(messaging.requestPermission)
                    .then(function (t) {
                        return messaging.getToken();
                    })
                    .then(function (token) {
                        // This saves the token to our server
                        Service.register(token);
                    })
                    .catch(function (error) {
                        console.log('Error occured: ' + error.message)
                    });
            }).catch(e => {
    console.log('Error during firebase registration: ' + e.message);
   });

        navigator.serviceWorker.addEventListener('message', event => {
         if (event.data.incidents) {
          // If the event data contains an incidents property, then this is a message from our
    // service worker notification click handlers. Load details for the incidents.
                window.location = some_url_path + event.data.incidents;
            }
        });

        _this.messaging.onMessage(function (payload) {
            handler();
        });

        _this.messaging.onTokenRefresh(function() {
            messaging.getToken()
                .then(function(refreshedToken) {
                    // This saves the refreshed token to our server
                    Service.register(refreshedToken);
                })
                .catch(function(err) {
                    console.log('Unable to retrieve refreshed token ', err);
                });
        });
    }
}

Несколько (возможно) соответствующих моментов:

  • У веб-клиента был активный токен FCM в течение некоторого времени (недели). Новый токен был сгенерирован в какой-то момент, но сейчас messaging.getToken() возвращает предыдущий токен.
  • Примерно в то время, когда был сгенерирован второй токен, мы (по ошибке) изменили путь к скрипту рабочего сервиса, который мы передаем navigator.serviceWorker.register(), По-видимому, это привело к двум зарегистрированным работникам службы (как видно из Chrome Developer Tools), но отмена регистрации работника с неверным путем не имела никакого эффекта.
  • Также примерно в то же время мы обновили библиотеку Firebase, которую использовали с 3.9.0 до 4.6.2.
  • С помощью инструментов разработчика Chrome я вижу, что есть две IndexedDB, и одна из них имеет fcm_token_object_Store с посторонним токеном, который отличается от токена, возвращаемого messaging.getToken() отображается в выводе консоли на изображении ниже:

Однако случилось так, что эти два токена FCM были созданы, и моя главная задача - как избавиться от одного из них. Есть ли способ получить все активные токены FCM для экземпляра клиента, чтобы мы могли вызвать messaging.deleteToken() на посторонний? Только по счастливой случайности я смог идентифицировать два токена, о которых идет речь, на машине, на которой я мог отлаживать, поэтому, если это произойдет для реального конечного пользователя, я не уверен, как мы исправим ситуацию.

0 ответов

Другие вопросы по тегам