移动端浏览器和桌面版 Chrome 完全是两码事。移动端 Chrome 要求 Notification 必须走 Service Worker 通道,直接 new Notification() 在手机上根本不会弹。
你需要在页面上注册 Service Worker,然后用 Service Worker 来触发通知:
先注册:
if ('serviceWorker' in navigator && 'Notification' in window) {
navigator.serviceWorker.register('/sw.js').then(registration => {
console.log('Service Worker 注册成功');
if (Notification.permission === 'granted') {
// 通过 Service Worker 显示通知
registration.showNotification('提醒', {
body: '你有新消息',
icon: '/icon.png'
});
}
});
}
Service Worker 文件(sw.js)里不需要写什么东西,只要注册上就行,但文件必须存在。
另外提醒一点,国内很多移动端浏览器对 Notification API 支持很差,比如微信内置浏览器、UC 浏览器基本不支持。如果你的用户群体主要在国内,建议直接用第三方推送服务或者短信/邮件替代。
还有一种情况是,如果你是想实现服务端主动推送,那光有 Notification API 不够,得用 Web Push(Push API + VAPID),需要后端配合。
然后看看你的代码逻辑,虽然你判断了 permission 是 granted,但最好再加个 feature detection,像这样:
另外要注意,移动端的通知行为很依赖用户交互。试试把通知触发绑定到一个用户点击事件上,而不是直接在页面加载时就发。
还有个坑就是,有些安卓机对低电量模式会禁用通知。记得测试的时候关闭省电模式。
最后提醒一句,处理通知内容要小心格式和特殊字符,别让用户看到一堆乱码。我上次就是因为忘了转义特殊字符导致显示错误,白白调试了半天。
你需要在页面上注册 Service Worker,然后用 Service Worker 来触发通知:
先注册:
Service Worker 文件(sw.js)里不需要写什么东西,只要注册上就行,但文件必须存在。
另外提醒一点,国内很多移动端浏览器对 Notification API 支持很差,比如微信内置浏览器、UC 浏览器基本不支持。如果你的用户群体主要在国内,建议直接用第三方推送服务或者短信/邮件替代。
还有一种情况是,如果你是想实现服务端主动推送,那光有 Notification API 不够,得用 Web Push(Push API + VAPID),需要后端配合。