Важно ли местоположение или область действия в рабочем веб-сервисе push?

У меня есть веб-приложение Django, которое содержит сервис worker, предназначенный для обработки push-уведомлений. Все работает замечательно. Во многих статьях, руководствах и документации говорится о том, что расположение и область видимости service worker'а очень важны и его нужно обязательно поместить в корень домена.

Смотрите, например, эту статью, в которой говорится:

Рабочий файл службы должен быть зарегистрирован в корневом каталоге вашего сайта.

И:

Я потратил 15 часов, чтобы узнать этот факт. Вам, ребята, повезло!

Итак, когда я впервые создал свой сервисный работник в Django, мне нужно было убедиться, что я правильно установил область видимости. Я создал View, который обслуживал JS-код рабочего сервиса в качестве шаблона, только для того, чтобы я мог установить заголовок Service-Worker-Allowed:

class ServiceWorkerView(TemplateView):
    template_name = 'web_push/web_push_service_worker.js'

    def get(self, request, *args, **kwargs):
        response = super().get(request, *args, **kwargs)
        response.headers['Content-Type'] = 'application/javascript'
        response.headers['Service-Worker-Allowed'] = '/'
        return response

В этом шаблоне содержался код обработки нажатий:

self.addEventListener('push', function(event) {
    ...
    self.registration.showNotification(...)
    ...
})

Как уже говорилось: это работает отлично.

Но теперь я задаюсь вопросом: почему область видимости имеет значение? Я просто изменил ситуацию и переместил код рабочего сервиса в стандартное место внутри статических папок Django. В коде регистрации SW я удалил атрибут scope. Теперь это просто:

navigator.serviceWorker
    .register('/static/account/sw.js')
    .then(function(registration) {
        ...
    })

Так что новая область применения этого SW теперь /static/account/.

Я провел тестирование в Chrome и Firefox, с localhost и используя ngrok, и это, кажется, тоже работает нормально.

Итак, мой вопрос: имеет ли значение scope и location service worker, который обрабатывает push-уведомления? Я что-то упустил? Есть ли случаи, когда область действия push SW важна?

Те же соображения, которые делают область видимости и местоположение очень важными, когда у вас есть работник службы с обработчиком fetch, не применимы к работникам службы только push.

Если вы просто используете стандартный scope и регистрируете рабочий скрипт службы, который существует где-то в вашем origin (navigator.serviceWorker.register('/static/account/sw.js') в вашем примере), это должно быть нормально для push событий.

Я считаю, что OneSignal и Firebase Cloud Messaging для веб имеют клиентские библиотеки, которые зарегистрируют для вас pushтолько рабочий сервис (настроенный на использование их бэкенда обмена сообщениями) с синтетическим диапазоном, который предположительно гарантированно не будет вмешиваться в ваши реальные URL и случайно брать под контроль клиентов, которых вы не ожидаете. Однако это излишество для того, что вы пытаетесь сделать.

Вернуться на верх