Push-уведомление "Ошибка регистрации не удалась - разрешение отклонено", прежде чем нажать на приглашение? - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь научиться использовать Push Notifications, но я получаю

Registration failed - permission denied

Ошибка даже до того, как я нажму разрешить или заблокировать приглашение.

Строка, которая вызывает эту ошибку в моем файле рабочего сервиса:

const subscription = await self.registration.pushManager.subscribe(options)

Странная вещь, если я нажимаю разрешить уведомления после ошибки и обновляю страницу, все работает нормально.

А когда я проверяю window.Notification.requestPermission, возвращается granted

Большая часть кода взята с https://blog.atulr.com/web-notifications/

const urlB64ToUint8Array = base64String => {
  const padding = '='.repeat((4 - (base64String.length % 4)) % 4)
  const base64 = (base64String + padding).replace(/\-/g, '+').replace(/_/g, '/')
  const rawData = atob(base64)
  const outputArray = new Uint8Array(rawData.length)
  for (let i = 0; i < rawData.length; ++i) {
    outputArray[i] = rawData.charCodeAt(i)
  }
  return outputArray
}

const saveSubscription = async subscription => {
  const SERVER_URL = 'http://localhost:8081/save-subscription'
  const response = await fetch(SERVER_URL, {
    method: 'post',
    headers: {
      'Content-Type': 'application/json',
    },
    body: JSON.stringify(subscription),
  })
  return response.json()
}

self.addEventListener('activate', async () => {
  // This will be called only once when the service worker is installed for first time.
  try {
    const applicationServerKey = urlB64ToUint8Array(
      'BO29MqroVuQiUch951aG0kASkvQy9S4OLshzA3xc12Ar3oAT7UMxjlsq3OMlQXQaSsZILLy7nWuvmbZNZ1YOrXo'
    )
    const options = { applicationServerKey, userVisibleOnly: true }
    const subscription = await self.registration.pushManager.subscribe(options)
    const response = await saveSubscription(subscription)
    console.log(response)
  } catch (err) {
    console.log('Error', err.message)
  }
})

self.addEventListener('push', function(event) {
  if (event.data) {
    console.log('Push event!! ', event.data.text())
    showLocalNotification('Yolo', event.data.text(), self.registration)
  } else {
    console.log('Push event but no data')
  }
})

const showLocalNotification = (title, body, swRegistration) => {
  const options = {
    body,
    // here you can add more properties like icon, image, vibrate, etc.
  }
  swRegistration.showNotification(title, options)
}
...