17

我的问题是,在注册 serviceWorker 后,navigator.serviceWorker.controller 始终为空。我从不强制刷新,只是刷新页面。我使用 Google Chrome 42.0.2311.152 m(32 位)对其进行了测试。

var currentServiceWorker = null;
navigator.serviceWorker.register(SERVICE_WORKER_URL).then(function(serviceWorkerRegistration { 
  if (navigator.serviceWorker.controller) {
    currentServiceWorker = navigator.serviceWorker.controller;
  } else {
    currentServiceWorker = serviceWorkerRegistration.active;
  }
});

根据这个:

ServiceWorkerContainer 接口的控制器只读属性在其状态被激活时返回一个 ServiceWorker 对象(与 ServiceWorkerRegistration.active 返回的对象相同)。如果请求是强制刷新(Shift + 刷新)或没有活动的工作人员,则此属性返回 null。(来源:https ://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/controller )

navigator.serviceWorker.controller应该返回与 相同的对象serviceWorkerRegistration.active。但是.active我得到了积极的工人,.controller没有。

你对这种情况有什么想法吗?

谢谢你,安迪

4

5 回答 5

19

调试时我首先要看的是您当前所在的页面是否属于服务人员的范围。如果您当前的页面不在范围内,那么它将不受控制(但您注册的 service worker 仍然可以被认为是活动的)。

您正在调用register(SERVICE_WORKER_URL)的默认情况下,将使用包含您的服务工作者脚本的目录作为范围。这通常是您想要的,但您需要确保它SERVICE_WORKER_URL指的是位于您网站根目录的脚本。这样,它将能够控制同一根级别的页面,或您的 Web 根目录下的目录中的页面。因此,如果您的服务工作者 JavaScript 文件当前位于/scripts/子目录或类似目录下,请将其移至根目录。

chrome://serviceworker-internals/您可以通过访问并查看与您的注册相关联的范围来检查服务人员的当前范围。

于 2015-05-15T14:48:56.260 回答
5

尝试在 service worker 中添加:

self.addEventListener('activate', event => {
    clients.claim();
    console.log('Ready!');
});
于 2019-03-01T06:38:56.227 回答
2

navigator.serviceWorker.register 只注册 serviceworker 并激活它。但是要控制服务工作者,您需要将服务工作者放在公共根文件夹中,以便所有页面都在范围内并且服务工作者将附加到它。

于 2016-12-30T09:11:15.193 回答
2

clients.claim() 答案为我做了这件事,还有一个控制器更改了侦听器:

navigator.serviceWorker.addEventListener("controllerchange", (evt) => {
    console.log("controller changed");
    this.controller = navigator.serviceWorker.controller;
});

谢谢 Kushagra Gour

于 2019-07-17T08:43:48.573 回答
1

确保在开发人员工具 > 应用程序 > 服务工作者下未选中“绕过网络”。这将阻止您的服务工作者控制器被设置。

于 2020-09-27T16:59:48.743 回答