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()
на посторонний? Только по счастливой случайности я смог идентифицировать два токена, о которых идет речь, на машине, на которой я мог отлаживать, поэтому, если это произойдет для реального конечного пользователя, я не уверен, как мы исправим ситуацию.