serviceworker icon indicating copy to clipboard operation
serviceworker copied to clipboard

Регистрация двух воркеров. зачем? и некоторые проблемы

Open Tsyklop opened this issue 6 years ago • 18 comments

Суть. В гайде описано что регистрируется один воркер firebase-ом (и этот вокрер должен быть в папке serviceworker, а не в корне приложения), второй (по сути должен быть пустой, но он тот же самый) уже в файле app.js.

Вопрос. зачем? Окей сделал как в гайде - пуши не отображаются. Они приходят но их не видно. Добавил в firebase-messaging-sw.js такой код:

self.addEventListener('push', function(event) {
  console.log('[Service Worker] Push Received.');
  console.log(`[Service Worker] Push had this data: "${event.data.text()}"`);

  const title = 'Push Codelab';
  const options = {
    body: 'Yay it works.',
    icon: 'images/icon.png',
    badge: 'images/badge.png'
  };

  event.waitUntil(self.registration.showNotification(title, options));
});

И пуши стали появляться. Смысл onMessage на 90 строке в app.js если он не работает. Проверил в дебаге - navigator.serviceWorker.ready.then не срабатывает вообще.

Tsyklop avatar Jun 18 '18 09:06 Tsyklop

Что-то не то вы дебажите или что-то не то делаете. Проверьте как работает приложение. После нажатия кнопки Send, у вас в логе должна появится запись Message received, что значит, что onMessage работает.

image

Один сервисворкер нужен для получения уведомлений в фоне от Firebase. Второй нужен для отображения уведомлений в onMessage. Незачем создавать пустой сервисворкер во втором случае если можно использовать тот же воркер, что мы используем в фоне. Так же имеет смысл делать не пустой сервсиворкер для обработки событий уведомления. Про onMessage я довольно подробно написал в статье.

и этот вокрер должен быть в папке serviceworker, а не в корне приложения

Наоборот. firebase-messaging-sw.js должен находится в корне (см. исходники), но конкретно в этом проекте это не так потому, что он запускается в GitHub Pages по адресу https://peter-gribanov.github.io/serviceworker/ и изменить этот путь нельзя. Именно поэтому, в проект скопирована оригинальная библиотека и в ней изменен путь к firebase-messaging-sw.js

peter-gribanov avatar Jun 18 '18 12:06 peter-gribanov

onMessage то работает, но само уведомление не показывается. Код отвечающий за отображение не работает ибо navigator.serviceWorker.ready.then на сроке 103 не срабатывает.

На счет пути воркера. В официальной либе без папки serviceworker, да это уже нашел.

Tsyklop avatar Jun 18 '18 12:06 Tsyklop

Может вы отключили показ уведомлений. Проверьте значение переменной permission. Я только, что установил голый Firefox и на нем все сразу работает.

Расскажите подробней, что вы делаете и в каком браузере?

peter-gribanov avatar Jun 18 '18 13:06 peter-gribanov

Делаю все в хроме последней версии.

Делаю так: Скачал проект с гитхаба. Так как он требует либо https или локаль то поставил приложение в хром для локального сервера. Создал папку, все скачанное переместил туда. Открываю страницу. Нажимаю на Register. Разрешаю показ уведомлений. Нажимаю Send и ничего. В консоли все появляется но само уведомление не показывается.

Tsyklop avatar Jun 18 '18 13:06 Tsyklop

Попробовал по вашему пути. У меня все работает.

image

У меня стояла принудительная проверка, что соединение по HTTPS. Я отключил ее. Проверьте еще раз. Может с этим проблема.

Проверьте права показа уведомлений:

image image

peter-gribanov avatar Jun 18 '18 13:06 peter-gribanov

Может вы на локале запускаете не по адресу /serviceworker/ ? В этом случае у вас не будут совпадать пути к сервисворкерам.

peter-gribanov avatar Jun 18 '18 13:06 peter-gribanov

Пути я правил. Не знаю в чем дело получается. Уведомления разрешал.

Странно это в общем. но ладно.

Спасибо за гайд. Очень полезно)

Tsyklop avatar Jun 18 '18 13:06 Tsyklop

Подскажите пожалуйста. Как сделать что бы пуши отображались при закрытом браузере?

Tsyklop avatar Jun 18 '18 13:06 Tsyklop

Если вы запускаете приложение в корне, то в этом месте вам нужно изменить путь на /firebase-messaging-sw.js и здесь подключить оригинальную библиотеку:

</body>
</html>
<script type="text/javascript" src="//www.gstatic.com/firebasejs/3.7.2/firebase.js"></script>
<script src="app.js"></script>

В таком виде у меня тоже все работает

image

peter-gribanov avatar Jun 18 '18 14:06 peter-gribanov

Как сделать что бы пуши отображались при закрытом браузере?

За отображение уведомлений при закрытом браузере отвечает сервисворкер firebase-messaging-sw.js. Читайте подробней в статье.

peter-gribanov avatar Jun 18 '18 14:06 peter-gribanov

Посмотрел сделал - не работает.

Tsyklop avatar Jun 18 '18 14:06 Tsyklop

Даже не знаю чем вам помочь :worried: Попробуйте запустить в Firefox

peter-gribanov avatar Jun 18 '18 14:06 peter-gribanov

Это уже скорее всего от того что хром полностью закрывается.

Tsyklop avatar Jun 18 '18 15:06 Tsyklop

Может подскажете. как разрешить проблему с пушами в Safari?

Спасибо.

Tsyklop avatar Jun 19 '18 12:06 Tsyklop

как разрешить проблему с пушами в Safari?

Safari не поддерживает стандарт push-уведомлений.

Вроде бы, в Safari есть своё API для push-уведомлений. Я его не смотрел. Ничего сказать по этому поводу не могу. Можете посмотреть этот гайд.

peter-gribanov avatar Jun 19 '18 14:06 peter-gribanov

Спасибо!

Tsyklop avatar Jun 19 '18 14:06 Tsyklop

Вечно с эпл проблемы.

Не знаю, может это баг но на маке, в хроме не грузится иконка которую я высылаю. это нормально? там просто иконка хрома.

Tsyklop avatar Jun 20 '18 08:06 Tsyklop

там просто иконка хрома

На моей практике, на некоторых мобильных устройствах вместо иконки отображается значек хрома. Я пытался это исправить различными методами, но у меня не получилось. Проблема ушла сама собой после обновления версии Android. Возможно на маке что-то аналогичное.

peter-gribanov avatar Jun 21 '18 07:06 peter-gribanov