На сайте используются уведомления с firebase. Когда pwa-приложение на телефоне в foreground, все нормально, приходят пуши, но если в background то прилетает их сразу два. Как выяснилось это связано с обработкой событий в сервис-воркере:
// firebase-messaging-sw.js
importScripts('https://www.gstatic.com/firebasejs/3.6.8/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/3.6.8/firebase-messaging.js');
firebase.initializeApp({
messagingSenderId: 'ххххххххххххх'
});
const messaging = firebase.messaging();
messaging.setBackgroundMessageHandler(function(payload) {
// return self.registration.hideNotification();
});
self.addEventListener('push', event => {
let payload = event.data.json();
let options = payload.notification;
options.data = {};
options.data.url = options.click_action;
let title = options.title;
event.waitUntil(Promise.all([self.registration.showNotification(title, options)]));
});
При background срабатывает и push и setBackgroundMessageHandler. Как их разветвить я не понял..
Если отключить библиотеки firebase, то push событие работает в background и foreground, но если телефон долго не трогать, то пуш не приходит и прийдет есть телефон разблокировать.
Решил вернуть firebase и убрать обработчик push, как следствие перестали приходить пуши в foreground. Написал в теле страницы:
messaging.onMessage(function(payload) {
...............
});
чтобы принимать пуш и показывать. Все хорошо, принимает, показывает, но на телефоне перестал обрабатываться notificationclick. Если пуш приходит background , то все ок и клик обработать можно.
Как правильно принять пуш на десктопе и телефоне в background и foreground?