3

我正在使用 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()无关的令牌?只是靠侥幸,我才能够在我可以调试的机器上识别出有问题的两个令牌,所以如果这种情况发生在真正的最终用户身上,我不确定我们将如何纠正这种情况。

4

0 回答 0