5

当我调用注册函数时,我正在使用 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 脚本。这是我的服务人员代码:

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

4

2 回答 2

1

使用 firebase 消息 SDK,您无需调用 register。

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

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

于 2017-01-03T22:48:38.297 回答
0

使用 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 文件具有服务工作者注册功能。所以当我注册服务工作者时,我实际上是在注册另一个。

于 2016-12-27T18:09:35.497 回答