navigator.serviceWorker.controller равен нулю до обновления страницы

Я работаю с angularjs и использую сервисный работник для получения push-уведомлений. но navigator.serviceWorker.controller равен нулю до обновления страницы, и я не знаю, как это сделать, чтобы решить эту проблему

некоторый код работника сервиса:

self.addEventListener('push', pwServiceWorker.pushReceived);
self.addEventListener('notificationclick', pwServiceWorker.notificationClicked);

// refresh caches
self.addEventListener('activate', function (event)
{
    event.waitUntil(
        caches.keys().then(function (cacheNames)
        {
            return Promise.all(
                cacheNames.map(function (cacheName)
                {
                    return caches.delete(cacheName);
                })
            );
        })
    );
});

и отправить сообщение клиенту в serviceworker при получении push:

self.clients.matchAll().then(function(all) {
    console.log(all);
    all.forEach(function(client) {
        client.postMessage(data);
    });
});

в mainController.js дать сообщение, как это:

 if (!navigator.serviceWorker || !navigator.serviceWorker.register) {
        console.log("This browser doesn't support service workers");
        return;
    }

    // Listen to messages from service workers.
    navigator.serviceWorker.addEventListener('message', function(event) {
        console.log("Got reply from service worker: " + event.data);
    });

    // Are we being controlled?
    if (navigator.serviceWorker.controller) {
        // Yes, send our controller a message.
        console.log("Sending 'hi' to controller");
        navigator.serviceWorker.controller.postMessage("hi");
    } else {
        // No, register a service worker to control pages like us.
        // Note that it won't control this instance of this page, it only takes effect
        // for pages in its scope loaded *after* it's installed.
        navigator.serviceWorker.register("service-worker.js")
            .then(function(registration) {
                console.log("Service worker registered, scope: " + registration.scope);
                console.log("Refresh the page to talk to it.");
                // If we want to, we might do `location.reload();` so that we'd be controlled by it
            })
            .catch(function(error) {
                console.log("Service worker registration failed: " + error.message);
            });
    }
 GillesC03 июл. 2016 г., 10:50
Разместите некоторый код, иначе никто не сможет вам помочь.

Ответы на вопрос(1)

Решение Вопроса

Это ожидаемое поведение. Чтобы получить контроль над всеми открытыми страницами, не дожидаясь обновления / повторного открытия, вы должны добавить эти команды в ваш Service Worker:

self.addEventListener('install', function(event) {
    event.waitUntil(self.skipWaiting()); // Activate worker immediately
});

self.addEventListener('activate', function(event) {
    event.waitUntil(self.clients.claim()); // Become available to all pages
});

Вы можете прочитать больше о них вskipWaiting () документы иclients.claim () Docs.

 GreatBlakes27 июн. 2017 г., 05:37
Я нашел этот фрагмент который использовал их в качестве обратного вызова, который отлично работал для меня.
 GreatBlakes27 июн. 2017 г., 04:19
Сделай этоevent.waitUntil(... функции идут в дополнение к функциям кэша (см. оригинальный вопрос) или заменяют их? Если их заменить, когда они привыкнут?
 GreatBlakes18 февр. 2018 г., 22:00
Еще одно замечание, которое я хочу сделать:shift + reload обойдёт сервисного работника и окно будет неуправляемым!

Ваш ответ на вопрос