Javascript 正在注册两次的服务器工作进程

Javascript 正在注册两次的服务器工作进程,javascript,firebase,firebase-cloud-messaging,service-worker,web-notifications,Javascript,Firebase,Firebase Cloud Messaging,Service Worker,Web Notifications,我正在使用FCM web通知服务,当我调用register函数时: if ('serviceWorker' in navigator) { window.addEventListener('load', function() { navigator.serviceWorker.register('/sw.js').then(function(registration) { // Registration was successful

我正在使用FCM web通知服务,当我调用register函数时:

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);
        });
      });
    }
服务人员注册了两次,一次是因为此功能,另一次是由。这是我的服务人员代码:

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);
});
importScripts('https://www.gstatic.com/firebasejs/3.5.2/firebase-app.js');
进口文件('https://www.gstatic.com/firebasejs/3.5.2/firebase-messaging.js');
“messagingSenderId”:”
});
const messaging=firebase.messaging();
messageing.setBackgroundMessageHandler(函数(有效负载){
self.addEventListener('notificationclick',函数(事件){
event.notification.close();
var承诺=新承诺(函数(解析){
设置超时(解析,1000);
}).然后(函数(){
返回clients.openWindow(payload.data.locator);
});
事件。等待(承诺);
});
var notificationTitle=payload.data.title;
变量通知选项={
body:payload.data.body,
图标:payload.data.icon
};
返回self.registration.showNotification(notificationTitle,
通知选项);
});

还有一件事,当我发送测试通知时,我单击第一条消息,它会正确打开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文件具有服务人员注册功能。
因此,当我注册服务人员时,实际上我正在注册另一个服务人员。

使用firebase messaging SDK,您无需调用register

如果调用register,则可以通过调用useServiceWorker()使SDK使用您的服务工作者(请参阅:)

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

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

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