我们可以通过其名称取消注册旧服务工作者并注册新的服务工作者

时间:2018-03-09 05:49:03

标签: push-notification service-worker

我面临一些与服务工作者有关的问题,之前我使用gcm,服务工作者文件名是service-worker.js,在发布fcm后我改变了我的代码,现在我的服务工作者文件名是firebase-messaging-sw .js但在我的客户端浏览器中调用旧的service-worker.js文件,该文件生成错误(找不到service-worker.js 500)。我在gettoken()之前已经使用了以下代码。

const messaging = firebase.messaging();
    navigator.serviceWorker.register('/firebase-messaging-sw.js')
.then((registration) => {
  messaging.useServiceWorker(registration);

  // Request permission and get token.....
});

但它仍然显示此错误。

1 个答案:

答案 0 :(得分:2)

通常,如果您有多个服务工作者注册了不同的范围,并且您希望从客户端页面获取它们的列表(并且可能根据匹配的范围或SW URL取消注册其中一些),您可以执行以下操作:

async unregisterSWs({matchingScope, matchingUrl}) {
  const registrations = await navigator.serviceWorker.getRegistrations();
  const matchingRegistrations = registrations.filter(registration => {
    if (matchingScope) {
      return registration.scope === matchingScope;
    }

    if (matchingUrl) {
      return registration.active.scriptURL === matchingUrl;
    }
  });

  for (const registration of matchingRegistrations) {
    await registration.unregister();
    console.log('Unregistered ', registration);
  }
}

然后调用它传入要用于取消注册的范围或SW脚本URL:

unregisterSWs({matchingScope: 'https://example.com/push'});
unregisterSWs({matchingUrl: 'https://example.com/my-push-sw.js'});