событие push не вызвано в сервисном работнике - PullRequest
0 голосов
/ 16 ноября 2018

После этого урока до раздела «Обработка события push» для настройки системы уведомлений на рабочем столе в моем приложении я сталкиваюсь с проблемой:

Когда я нажимаю «push», чтобы отправить уведомлениеискусственно с Chrome, уведомление не появляется.В консоли нет сообщений.

Я разрешил уведомление с веб-сайта, и сервисный работник хорошо установлен в моем браузере.

Мой сервисный работник выглядит так:

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

  const title = 'My App Name'
  const options = {
    body: event.data.text(),
    icon: 'pwa/icon.png',
    badge: 'pwa/badge.png'
  }

  const notificationPromise = self.registration.showNotification(title, options)
  event.waitUntil(notificationPromise)
})

и моя регистрация сервисного работника (с использованием register-service-worker npm package) выглядит следующим образом:

import { register } from 'register-service-worker'

const applicationServerPublicKey = 'BI5qCj0NdNvjDcBYTIXiNccdcP74Egtb3WxuaXrHIVCLdM-MwqPkLplHozlMsM3ioINQ6S_HAexCM0UqKMvaYmg'

function urlB64ToUint8Array (base64String) {
  const padding = '='.repeat((4 - base64String.length % 4) % 4)
  const base64 = (base64String + padding)
    .replace(/\-/g, '+')
    .replace(/_/g, '/')

  const rawData = window.atob(base64)
  const outputArray = new Uint8Array(rawData.length)

  for (let i = 0; i < rawData.length; ++i) {
    outputArray[i] = rawData.charCodeAt(i)
  }
  return outputArray
}

async function manageNotificationSubscription (registration) {
  const subscription = await registration.pushManager.getSubscription()
  let isSubscribed: boolean = !(subscription === null)

  if (isSubscribed) {
    console.log('User IS subscribed.')
  } else {
    console.log('User is NOT subscribed.')
    const applicationServerKey = urlB64ToUint8Array(applicationServerPublicKey)
    try {
      await registration.pushManager.subscribe({
        userVisibleOnly: true,
        applicationServerKey: applicationServerKey
      })
      console.log('User just subscribed.')
    } catch (e) {
      console.error('Failed to subscribe the user: ', e)
    }
  }
}

if (process.env.NODE_ENV === 'production') {
  register(`${process.env.BASE_URL}service-worker.js`, {
    ready () {
      console.log(
        'App is being served from cache by a service worker.'
      )
    },
    async registered (registration) {
      console.log('Service worker has been registered.')
      await manageNotificationSubscription(registration)
    },
    cached () {
      console.log('Content has been cached for offline use.')
    },
    updated () {
      console.log('New content is available; please refresh.')
    },
    offline () {
      console.log('No internet connection found. App is running in offline mode.')
    },
    error (error) {
      console.error('Error during service worker registration:', error)
    }
  })
}

Похоже, что push-событие в сервис-работнике недаже вызвал ... Я сделал что-то не так?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...