You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 20:32:48