无需登录 数据私有 本地保存

Web 推送通知调试器 - 检查订阅与推送参数

9
0
0
0
🔔 通知权限
检测中...
⚙️ Service Worker
检测中...
📡 推送订阅
检测中...
🔒 HTTPS
检测中...
🧪 通知测试面板 Notification API
📡 推送订阅管理 Push API
Chrome需要VAPID公钥,Firefox可选
暂无推送订阅
点击"创建订阅"开始
📋 操作日志
--:--:--🔍 推送通知调试器已初始化,正在检测环境...
📖 常见问题与知识点

普通通知(Notification API)仅在用户打开网页时才能触发,由页面的JavaScript直接调用new Notification()创建。
Web推送通知(Push API + Notification API)则通过浏览器推送服务,即使用户关闭了网页,服务器也能通过推送服务将消息送达浏览器,由Service Worker在后台显示通知。推送通知需要Service WorkerHTTPS用户订阅三个条件。

Service Worker是独立于网页运行的后台脚本。当推送消息到达时,浏览器会唤醒对应的Service Worker(即使网页已关闭),由SW的push事件监听器接收消息并调用self.registration.showNotification()显示通知。没有SW,浏览器无法在页面关闭后接收推送消息。SW也负责处理通知点击事件,将用户引导回网站。

VAPID(Voluntary Application Server Identification)是一对公钥/私钥,用于标识推送服务器身份,防止未授权的第三方发送推送消息。公钥在订阅时传给浏览器,私钥在服务器端用于签名推送请求。

生成方式:可使用npx web-push generate-vapid-keys命令,或使用Node.js的web-push库,也可以用OpenSSL生成。公钥是Base64 URL-safe编码的65字节未压缩椭圆曲线点。

p256dh:基于P-256椭圆曲线的Diffie-Hellman公钥,用于加密推送消息内容,确保只有对应的私钥持有者(浏览器)能解密。
auth:认证密钥(16字节),用于消息完整性验证,防止推送消息被篡改。
这两个密钥与endpoint一起构成完整的推送订阅。服务器发送推送时必须使用订阅者的公钥加密消息体,这是Web Push协议的安全基础。

浏览器为了防止网站反复骚扰用户,当用户选择"拒绝"或"阻止"后,Notification.requestPermission()将不再显示权限对话框,而是静默返回denied。用户需要手动修改浏览器设置:点击地址栏左侧的锁图标 → 找到"通知" → 将权限改为"允许"。不同浏览器路径略微不同,但都在站点设置中。

Chrome(桌面+Android):全面支持,需要VAPID密钥,通知图标建议192×192。
Firefox(桌面+Android):全面支持,VAPID可选,支持更灵活的通知交互。
Safari(macOS 13+):从Safari 16开始支持标准Web Push,需网站添加到Dock。
iOS Safari(16.4+):需要网站添加到主屏幕(PWA模式),支持有限。
Edge:与Chrome行为基本一致(基于Chromium)。

tag是一个字符串标识符,用于分组和替换同类通知。如果发送的新通知与当前显示的通知有相同的tag,旧通知会被替换而不是堆叠多条。典型应用场景:同一聊天会话的多条消息,使用会话ID作为tag,通知栏始终只显示最新一条,避免刷屏。

localhost在大多数浏览器中被视为安全上下文,可以直接测试推送通知(包括Service Worker和Push API)。
步骤:①使用http://localhost(非127.0.0.1,部分浏览器有差异);②注册Service Worker;③请求通知权限;④使用PushManager创建订阅;⑤将订阅对象发送到后端;⑥后端使用web-push库发送推送消息。推荐使用Chrome DevTools的Application面板查看Service Worker和Push订阅状态。

是的,推送订阅可能过期。订阅对象的expirationTime字段指示过期时间(可能为null表示无明确过期时间)。浏览器推送服务可能会轮换密钥或清理不活跃的订阅。最佳实践:每次用户访问时调用registration.pushManager.getSubscription()检查订阅状态,使用pushsubscriptionchange事件监听订阅变更,及时将新订阅信息同步到后端服务器。