javascript - 服务器 worker 被注册两次

标签 javascript firebase firebase-cloud-messaging service-worker web-notifications

我正在使用 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 .这是我的服务 worker 代码:

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

最佳答案

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

如果调用 register,您可以通过调用 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 为您注册服务 worker 的原因是它设置了一个范围,以防止它干扰您可能拥有的任何其他服务 worker 。

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

关于javascript - 服务器 worker 被注册两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41240743/

相关文章:

javascript - 获取并循环遍历 AngularJS 中的未知对象

ios - Firebase 在 Swift iOS 中将我的 Double 检索为字符串?

android - FirebaseRecyclerAdapter、PopulateViewHolder 滚动时多次调用

ios - 带有 Swift 的 Firebase 对 observeEventType 的模糊使用

google-cloud-messaging - Firebase 推送通知和 FCM 消息有什么区别?

android - 通过 Firebase Cloud Messaging 向 Android 设备发送消息

firebase - 通过rest api发送消息时如何设置通知 channel ?

javascript - 使用 jQuery 遍历 DOM

javascript - 无法在 npm run build 上缩小代码

javascript - 如何让html打印javascript函数的返回值?