macOS 16.5.2 Safari中Web推送通知Token频繁变更问题求助
macOS 16.5.2 Safari下Firebase推送Token退出后变更的问题
问题详情
我用Firebase Admin SDK实现的Web推送通知功能,在Windows和macOS的Chrome浏览器中运行正常,但在macOS 16.5.2版本的Safari里出现异常:每次关闭Safari后重新打开,推送Token都会发生变更,导致用户无法接收新通知。而macOS系统的Chrome浏览器没有这个问题。
当前使用的getToken代码片段如下:
const token = localStorage.getItem('firebaseToken') const messaging = getMessaging(firebaseApp); getToken(messaging, { vapidKey: 'my vapid key'}) .then((currentToken) => { if (currentToken != token) { console.log(currentToken) sendTokenToServer(currentToken) } else { console.log('Already saved'); } }).catch((err) => { console.log('An error occurred while retrieving token. ', err); });
原因解析
- Safari默认隐私设置:Safari默认开启「退出时清除网站数据」选项,退出浏览器时会自动删除网站的Service Worker缓存、Push订阅记录及关联的Token数据。而Chrome不会默认清除这类持久化数据,因此Token能保持稳定。
- Web Push实现差异:Safari对Web Push的实现逻辑与Chromium内核浏览器不同,它的推送Token与浏览器会话绑定更紧密,当浏览器完全退出(包括后台进程)后,旧的Push订阅会被标记为无效,重新打开浏览器时会生成全新的Token。
- localStorage的局限性:代码中用localStorage存储旧Token,但Safari在退出时可能会清空localStorage数据(受隐私设置影响),导致下次打开浏览器时无法有效比对新旧Token;即使能比对,此时旧Token已经实际失效。
解决办法
- 调整Safari隐私配置:引导用户关闭「退出时清除网站数据」选项,或者将目标网站添加到「网站数据」白名单(在
Safari>设置>隐私>管理网站数据中操作),允许网站保留持久化数据。 - 优化Token同步逻辑:页面加载时主动调用
getToken,无论localStorage中是否存储旧Token,都获取当前有效Token并与服务器存储的Token比对,若不一致则立即更新服务器端记录;同时监听onTokenRefresh事件,在Token自动刷新时及时同步到服务器。 - 处理Token失效场景:服务器端推送通知时,若收到「InvalidToken」类错误,标记该Token为无效,等用户下次访问网站时重新获取并更新服务器数据。
内容的提问来源于stack exchange,提问作者Franco Ribarov
相关产品推荐
相关产品推荐

