Почему сообщение обслуживающего персонала никогда не доходит до клиента

Я пытаюсь настроить этот пример и заставить его работать, однако, с одним самым простым файлом сценария и одним рабочим файлом, он никогда не отправляет сообщение клиенту от работника службы. В чем может быть проблема?

Браузер:

Google Chrome Версия 64.0.3282.167 (официальная сборка) (64-разрядная)

main.js

navigator.serviceWorker.addEventListener('message', event => {
  console.log(event.data.msg, event.data.url);
});

navigator.serviceWorker.register("sw.js")
  .then(function (registration) {
    console.log("ServiceWorker registration successful with scope: ", registration.scope);
  })
  .catch(function (error) {
    console.error("Service Worker Error", error);
  });

sw.js

addEventListener('install', event => {
    event.waitUntil(self.skipWaiting());
});

addEventListener('activate', event => {
    event.waitUntil(self.clients.claim());
});

addEventListener('fetch', event => {
  event.waitUntil(async function() {
    // Exit early if we don't have access to the client.
    // Eg, if it's cross-origin.
    if (!event.clientId) return;

    // Get the client.
    const client = await clients.get(event.clientId);
    // Exit early if we don't get the client.
    // Eg, if it closed.
    if (!client) return;

    // Send a message to the client.
    client.postMessage({
      msg: "Hey I just got a fetch from you!",
      url: event.request.url
    });
  }());
});

Я console.log везде, и метод client.postMessage вызывается.

введите здесь описание изображения  введите описание изображения здесь

Это работает в Mozilla Firefox Quantum 58.0.2 (64-разрядная версия)


person vardius    schedule 20.02.2018    source источник
comment
Возможно, ваш сервисный работник еще не контролирует страницу - попробуйте заявить права на нее и / или не ждать ее.   -  person Henrik Andersson    schedule 22.02.2018
comment
Я пробовал, но это не помогло   -  person vardius    schedule 22.02.2018
comment
@HenrikAndersson Я обновил код SW с его помощью   -  person vardius    schedule 22.02.2018
comment
Вы пробовали использовать navigator.serviceWorker.controller.postMessage?   -  person Henrik Andersson    schedule 22.02.2018
comment
но я хочу отправить сообщение от сервис-воркера клиенту, а не наоборот   -  person vardius    schedule 22.02.2018
comment
вы имеете в виду push-уведомление?   -  person oninross    schedule 22.02.2018
comment
@oninross нет Я имею в виду postMessage - Метод postMessage () клиента позволяет работнику службы отправлять сообщение клиенту   -  person vardius    schedule 22.02.2018


Ответы (1)


Сначала вы должны получить клиентский объект. Добавьте это в свой fetch слушатель.

self.clients.matchAll().then(function (clients){
    clients.forEach(function(client){
        client.postMessage({
            msg: "Hey I just got a fetch from you!",
            url: event.request.url
        });
    });
}); 
person Ronnie Royston    schedule 05.07.2018
comment
Я использую эту строку, чтобы получить клиента по идентификатору await clients.get(event.clientId); - person vardius; 06.07.2018
comment
Ok. Я наконец смог передать сообщение от моего сервис-воркера в свое окно, используя приведенный выше код. ... если ваш работает по-другому, хорошая сделка. Вышеупомянутое работает для меня. - person Ronnie Royston; 06.07.2018
comment
Спасибо, я попробую сегодня позже, после работы, и опубликую свои результаты, чтобы вы знали - person vardius; 06.07.2018
comment
это сработало для меня, когда ожидание клиентов. get не сработало - person beek; 13.09.2020