javascript - 在点击提示之前推送通知 "Error Registration failed - permission denied"?

标签 javascript push-notification service-worker

我正在尝试学习如何使用推送通知,但我收到了

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)
}

最佳答案

在注册 Service Worker 或订阅推送服务之前,您需要请求通知权限。

根据https://blog.atulr.com/web-notifications/中的代码,将index.js中以下两条语句的顺序更改为

const swRegistration = await registerServiceWorker();
const permission =  await requestNotificationPermission();

const permission =  await requestNotificationPermission();    
const swRegistration = await registerServiceWorker();

这应该可以修复下面的错误消息。

Registration failed - permission denied

关于javascript - 在点击提示之前推送通知 "Error Registration failed - permission denied"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55316397/

相关文章:

javascript - Angular react 形式在(更改)事件回调上具有旧值

android - 你能在 Windows 服务器上设置 GCM 吗?

ios - 发送通用推送通知 - Xcode

angular - http-server -p 8082 显示 ERR_INVALID_REDIRECT

google-chrome - chrome.gcm 仅适用于应用程序和扩展程序,我如何将其用作普通网站?

javascript - 在 DOM 加载后使用 jQuery 或 JavaScript 将属性添加到 anchor

javascript - 将对象从子页面传递到父页面

javascript - 带有 JavaScript 代码的字符串中的 HTML,JS 不工作

Node.js 和推送通知

google-chrome - 网络应用程序 : Failures: Service worker does not successfully serve the manifest's start_url