服务器工作者被注册两次

Server worker being registered twice

我正在使用 FCM 网络通知服务,当我调用注册函数时:

if ('serviceWorker' in navigator) {
         window.addEventListener('load', function() {
        navigator.serviceWorker.register('/sw.js').then(function(registration) {
          // Registration was successful
          console.log('ServiceWorker registration successful with scope: ', registration.scope);
        }).catch(function(err) {
          // registration failed :(
          console.log('ServiceWorker registration failed: ', err);
        });
      });
    }

service worker 被注册了两次,一次是因为这个函数,一次是 FCM script。这是我的服务人员代码:

importScripts('https://www.gstatic.com/firebasejs/3.5.2/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/3.5.2/firebase-messaging.js');

    'messagingSenderId': '<my senderid>'
});

const messaging = firebase.messaging();


messaging.setBackgroundMessageHandler(function (payload) {
   
    
    self.addEventListener('notificationclick', function (event) {
        event.notification.close();

        var promise = new Promise(function (resolve) {
            setTimeout(resolve, 1000);
        }).then(function () {
            return clients.openWindow(payload.data.locator);
        });

        event.waitUntil(promise);
    });
   
    var notificationTitle = payload.data.title;
    var notificationOptions = {
        body: payload.data.body,
        icon: payload.data.icon
    };
    return self.registration.showNotification(notificationTitle,
        notificationOptions);
});

还有一件事,当我发送测试通知时,我单击第一条消息并正确打开 URL,但在 Chrome 的同一实例中,我单击打开所有其他消息第一条消息的URL。这个问题在 Firefox 上不会发生,只是 Chrome。我正在使用 chrome 版本 55

在使用 FCM 服务时,我导入了以下 Firebase 脚本

   importScripts('https://www.gstatic.com/firebasejs/3.5.2/firebase-app.js');
   importScripts('https://www.gstatic.com/firebasejs/3.5.2/firebase-messaging.js');

firebase-messaging.js 文件具有 service worker 注册功能。 所以当我注册 service worker 时,我实际上是在注册另一个。

使用 firebase 消息传递 SDK,您无需调用注册。

如果调用注册,你可以通过调用useServiceWorker()让SDK使用你的service worker(参见:https://firebase.google.com/docs/reference/js/firebase.messaging.Messaging#useServiceWorker

if ('serviceWorker' in navigator) {
  window.addEventListener('load', function() {
    navigator.serviceWorker.register('/sw.js')
    .then(function(registration) {
      messaging.useServiceWorker(registration);
    });
  });
}

SDK 为您注册服务工作者的原因是它设置了一个范围,以防止它干扰您可能拥有的任何其他服务工作者。

关于您的第二个问题,您发送的是不同的网址还是相同的网址?