Service Worker 的 push 事件监听必须在顶层作用域注册,即直接写在 sw.js 文件最外层,不可包裹在 install/activate 回调、函数或异步逻辑中,否则浏览器无法识别并触发该事件。
Service Worker 的 push 事件监听必须在顶层作用域注册
浏览器只会在 Service Worker 脚本的最外层(即非函数、非条件块内)执行
时,才将其识别为有效的推送事件处理器。如果把它写在
回调里,或封装成函数再调用,事件根本不会触发。
必须直接写在 SW 文件顶部作用域,不能包裹在
、
或异步回调中
确保没有语法错误或未捕获的异常——SW 启动失败会导致整个
监听器静默失效
Chrome DevTools 的 Application → Service Workers 面板里,点击 “Update on reload” 并刷新页面,可强制重载 SW 并查看控制台是否报错
push 事件中不能直接操作 DOM,只能发通知或写缓存
事件运行在独立线程(Service Worker 环境),没有
、
或
。常见错误是试图在里面调用
后更新页面元素,这会抛出
。
能做的只有三类操作:调用
、调用
获取已打开页面并
、用
预存资源
如果需要页面响应,得用
,再在页面 JS 中监听
注意
的
字段必须是可序列化的对象(不能含函数、Date、RegExp 等),否则通知无法显示
后端发送 VAPID 推送前必须校验 subscription 和密钥格式
浏览器生成的
是个对象,含
、
、
。后端若直接把整个对象 JSON.stringify 后发给推送服务(如 WebPush),大概率返回
或
。
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
下载
必须是完整 HTTPS URL(不能以
结尾,也不能缺协议)
和
必须是 base64url 编码(不是标准 base64),且无填充字符(=)、无换行;Node.js 可用
辅助验证
VAPID 公钥需提前通过
时传入
注册,私钥绝不能泄露到前端
调试 push 事件最有效的三个检查点
本地测试时,90% 的“收不到推送”问题集中在以下三处,按顺序排查比反复改代码更快。
立即学习
“
前端免费学习笔记(深入)
”;
在 Chrome 地址栏输入
,确认你的 SW 已激活(Active)且状态为 “Waiting” 或 “Running”,右键 “Unregister” 后刷新重装
在 SW 文件里加
,然后用
模拟推送,看控制台是否有日志
检查浏览器设置:地址栏输入
,确认你的域名有通知权限;若用 localhost,需启用
VAPID 推送链路里最容易被忽略的是密钥编码格式和 SW 生命周期状态——endpoint 多一个斜杠、p256dh 少两个等号、SW 卡在 Waiting 状态,都会让消息彻底消失,且不报错。
self.addEventListener('push', ...)self.addEventListener('install', ...)iffunctionpushpushwindowdocumentalert()fetch()ReferenceError: document is not definedself.registration.showNotification()self.clients.matchAll()postMessagecache.put()self.clients.matchAll().then(clients => clients.forEach(c => c.postMessage(...)))navigator.serviceWorker.addEventListener('message', ...)showNotification()datasubscriptionendpointkeys.p256dhkeys.auth400 Bad Request401 Unauthorizedendpoint/pushkeys.p256dhkeys.authcrypto.createPublicKey(...).export({ format: 'jwk', ... })navigator.serviceWorker.register()applicationServerKeychrome://serviceworker-internals/self.addEventListener('push', e => { console.log('push received:', e.data?.json()); e.waitUntil(Promise.resolve()); });cURLchrome://settings/content/notificationschrome://flags/#unsafely-treat-insecure-origin-as-secure