我使用Firebase Javascript SDK将网络推送通知添加到React JS应用。通过一系列事件,我们结束了两个似乎来自同一个Web客户端(相同的机器,浏览器和站点域)的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);
});
});
}
}

一些(可能)相关的观点:
messaging.getToken()
正在返回上一个令牌。navigator.serviceWorker.register()
的服务工作者脚本的路径。这似乎导致了两个注册的服务工作者(如Chrome开发者工具中所示),但取消注册具有错误路径的工作人员没有任何效果。messaging.getToken()
返回的令牌不同:然而,碰巧这两个FCM令牌已经创建,我主要关心的是如何摆脱其中一个。是否有某种方法可以为客户端实例获取所有活动的FCM令牌,以便我们可以在无关的上调用messaging.deleteToken()
?只有通过侥幸,我才能在我可以调试的机器上识别出两个令牌,所以如果这对真正的最终用户来说是这样的话,我不确定我们如何纠正这种情况