Важно ли местоположение или область действия в рабочем веб-сервисе 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 и случайно брать под контроль клиентов, которых вы не ожидаете. Однако это излишество для того, что вы пытаетесь сделать.