Chrome: Serviceworker не переходит в рабочее состояние при получении push-сообщения

Мы внедрили SDK, чтобы упростить процесс отправки и получения push-уведомлений. Однако недавно мы столкнулись с проблемой, которая приводит к получению сообщения Generic Notification (т. е. Этот сайт был обновлен в фоновом режиме) всякий раз, когда мы отправляем push-сообщение.

После периода проверок и проб и ошибок мы пришли к грубому выводу, что:

  • Всякий раз, когда мы отправляем push-уведомление, в первый раз, сервисный работник не просыпается и не зависает в состоянии Stopped. В результате отображается Generic Notification. В ближайших последующих Push-сообщениях сервис-воркер переходит в состояние Running и получает Push-сообщения.
  • Следующий код, отвечающий за обработку события push, не вызывается при первой отправке Push-сообщения.
@serviceWorkerEvent('push')
    public static async onPushEvent(context: Context, event: PushEvent) {
        context.api.pushDelivered({
            // Sending Analytics
        }).catch(e => log.error('e'));

        const notificationOptions: NotificationOptions = {
            // Notification Options
        };

        const notifTitle = notificationData.title || '';
        await (await context.serviceWorker.registration).showNotification(notifTitle, notificationOptions);

        await context.workerMessenger.broadcast(WORKER_MESSAGE_TYPES.PUSH_RECEIVED, notificationData);
    }

P.S. Используя функцию-оболочку, содержащую event.waitUntil(), мы ждем разрешения обещаний внутри.


person NeverQuit    schedule 25.04.2021    source источник


Ответы (1)


Это предполагаемое поведение. Ваш сервис-воркер не обрабатывает первое событие push, потому что ваша страница по-прежнему является для него неконтролируемым клиентом. Ваш сервис-воркер еще не находится в состоянии active.

Из Жизненный цикл Service Worker (настоятельно рекомендуется прочитать):

Service Worker не будет получать такие события, как fetch и push, до тех пор, пока он успешно не завершит установку и не станет активным.

Чтобы обработать первое событие push, вы можете:

  1. вызовите location.reload() в сценарии регистрации сервисного работника
  2. вызовите clients.claim() в свой сервисный работник

Вариант 2 переопределяет поведение сервис-воркера по умолчанию и позволяет ему взять под контроль неконтролируемых клиентов (ваш sw немедленно требует клиентов).

Смотрите также:

person jackdbd    schedule 26.04.2021
comment
Мне действительно удалось решить проблему. Мы игнорировали предупреждение о том, что события Your serviceworker должны быть зарегистрированы ранее. Полезно отметить, что сервисворкер уже был активирован и контролировал различные события. - person NeverQuit; 28.04.2021