Navigator.serviceWorker.controller всегда имеет значение null

У меня возникла проблема, что после регистрации serviceWorker navigator.serviceWorker.controller всегда имеет значение null. Я никогда не обновляю силу и просто обновляю страницу. Я тестирую его с помощью 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). Это свойство возвращает значение null, если запрос является обновлением силы (Shift + refresh) или если нет активного рабочего. (Источник: https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/controller)

navigator.serviceWorker.controller должен возвращать тот же объект, что и serviceWorkerRegistration.active. Но с .active я получаю активный рабочий, с .controller not.

Есть ли у вас какие-либо идеи для этой ситуации?

Спасибо, Andi

Ответ 1

Первое, на что я бы посмотрел, когда отлаживается это, является ли текущая страница, на которой вы находитесь, подпадает под сферу действия рабочего. Если ваша текущая страница не находится под областью, то она не будет контролироваться (но зарегистрированный сервис-работник все равно может считаться активным).

Вы вызываете register(SERVICE_WORKER_URL), который по умолчанию будет использовать каталог, в котором содержится ваш рабочий сервис script, как область действия. Обычно это то, что вам нужно, но вам нужно убедиться, что SERVICE_WORKER_URL относится к script, расположенному в корне вашего веб-сайта. Таким образом, он сможет контролировать страницы как на одном корневом уровне, так и на страницах в каталогах под вашим веб-корнем. Поэтому, если ваш JavaScript файл службы работает в подкаталоге /scripts/ или что-то в этом роде, переместите его в корневой каталог.

Вы можете проверить текущую сферу деятельности своего сервисного работника, посетив chrome://serviceworker-internals/ и посмотреть, какая область видимости связана с вашей регистрацией.

Ответ 2

navigator.serviceWorker.register только зарегистрировать serviceworker и активировать его. но чтобы получить контролера над serviceworker, вам нужно поместить вашего serviceworker в общедоступную корневую папку, чтобы все страницы были в области, и сервисный работник будет прикреплен к нему.

Ответ 3

Попробуйте добавить это в сервисный работник:

self.addEventListener('activate', event => {
    clients.claim();
    console.log('Ready!');
});

Ответ 4

Ответ клиентов .claim() сделал это для меня, вместе с контроллером изменил слушателя:

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

Спасибо Кушагра Гур