push-notification - 服务工作者中未触发推送事件
问题描述
按照本教程直到“处理推送事件”部分在我的应用程序中设置桌面通知系统,我遇到了一个问题:
当我单击“推送”以使用 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 包)如下所示:
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)
}
})
}
看起来服务工作者中的推送事件甚至没有被触发......我做错了什么吗?
解决方案
推荐阅读
- artificial-intelligence - 最好的第一次搜索是最优的和完整的吗?
- javascript - 在javascript中设置超时与onclick事件混淆
- join - 连接2列的内容
- c# - 桌面 Win10 Toast 通知活动回调未触发
- matlab - MATLAB 可以绘制时间事件条吗?
- javascript - JS:如何动态获取变量名
- vue.js - Laravel echo 监听耳语功能不起作用
- oracle - 如何在 Windows 10 机器上重启 oracle 11g 数据库
- python - KNN 回归导致训练集 (sklearn) 上的 MSE 为零
- javascript - 跨字段验证在 Angular 中不起作用