我正在使用 Firebase Javascript SDK 将网络推送通知添加到 React JS 应用程序。通过一系列事件,我们最终得到了两个 FCM 令牌,它们似乎来自同一个 Web 客户端(相同的机器、浏览器和站点域)。在客户端上接收到发送到任一令牌的 FCM 消息。我原以为其中一个令牌会失效,但似乎并非如此。当这种情况发生时,是否可以识别和删除无关令牌?
注册我们的 Service Worker 并将 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);
});
});
}
}
一些(可能)相关点:
- Web 客户端在一段时间(几周)内拥有一个活跃的 FCM 令牌。新令牌是在某个时候生成的,但现在
messaging.getToken()正在返回以前的令牌。 - 大约在生成第二个令牌时,我们(错误地)更改了我们传递给的服务工作者脚本的路径
navigator.serviceWorker.register()。这似乎导致了两个注册的服务工作人员(如 Chrome 开发人员工具中所见),但取消注册路径不正确的工作人员没有任何效果。 - 大约在同一时间,我们从我们使用的 Firebase 库从 3.9.0 更新到 4.6.2
- 通过 Chrome 开发者工具,我可以看到有两个 IndexedDB,其中一个有一个带有无关令牌的 fcm_token_object_Store,这与下
messaging.getToken()图中控制台输出中显示的返回的令牌不同:
然而碰巧这两个 FCM 代币被创建了,我主要关心的是如何摆脱其中一个。是否有某种方法可以获取客户端实例的所有活动 FCM 令牌,以便我们可以调用messaging.deleteToken()无关的令牌?只是靠侥幸,我才能够在我可以调试的机器上识别出有问题的两个令牌,所以如果这种情况发生在真正的最终用户身上,我不确定我们将如何纠正这种情况。
