FCM为同一个Javascript客户端提供了两个活动令牌

时间:2017-12-29 21:08:26

标签: javascript firebase firebase-cloud-messaging web-notifications

我使用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);
                });
        });
    }
}




一些(可能)相关的观点:

  • Web客户端有一段时间(几周)的活动FCM令牌。新令牌是在某个时刻生成的,但现在messaging.getToken()正在返回上一个令牌。
  • 在生成第二个令牌的时候,我们(错误地)改变了传递给navigator.serviceWorker.register()的服务工作者脚本的路径。这似乎导致了两个注册的服务工作者(如Chrome开发者工具中所示),但取消注册具有错误路径的工作人员没有任何效果。
  • 大约在同一时间我们从使用3.9.0到4.6.2
  • 的Firebase库进行了更新
  • 通过Chrome Developer工具,我可以看到有两个IndexedDB,其中一个有一个带有无关令牌的fcm_token_object_Store,这与下图中控制台输出中显示的messaging.getToken()返回的令牌不同:

enter image description here

然而,碰巧这两个FCM令牌已经创建,我主要关心的是如何摆脱其中一个。是否有某种方法可以为客户端实例获取所有活动的FCM令牌,以便我们可以在无关的上调用messaging.deleteToken()?只有通过侥幸,我才能在我可以调试的机器上识别出两个令牌,所以如果这对真正的最终用户来说是这样的话,我不确定我们如何纠正这种情况

0 个答案:

没有答案