PWA 的 Background Sync 在 iOS 上为啥不生效?

上官伊糖 阅读 2

我用 PWA 做了个待办事项应用,用户提交任务时如果网络不好,就注册了 background sync 想等网络恢复再同步。在安卓 Chrome 上跑得好好的,但一到 iOS Safari 就完全没反应,连 sync 事件都没触发。查了文档说 iOS 对 Service Worker 支持有限,但具体哪些能用哪些不能用也搞不清楚。

我已经确认 service worker 注册成功,也申请了 notification 权限(听说 background sync 需要这个),但还是不行。是不是 iOS 根本就不支持 Background Sync 啊?那有啥替代方案吗?

顺便贴一下我页面里用的 CSS,虽然应该没关系,但怕有冲突:

.offline-banner {
  background: #ff6b6b;
  color: white;
  padding: 8px;
  text-align: center;
  display: none;
}

.offline-banner.show {
  display: block;
}
我来解答 赞 5 收藏
二维码
手机扫码查看
1 条解答
 ___慧丽
唉,iOS对PWA的支持就是让人头大。直说吧,iOS压根就不支持Background Sync API,你查的那些文档没错。Safari虽然支持Service Worker,但阉割了一堆功能,其中就包括Background Sync。

你那个CSS完全没问题,跟这个没关系。性能上我给你几个替代方案:

1. 用定期轮询检查网络状态,虽然耗电但能解决问题:
// 简单粗暴版轮询
setInterval(() => {
if(navigator.onLine) {
// 执行你的同步逻辑
}
}, 30000); // 30秒检查一次


2. 监听online/offline事件更优雅些:
window.addEventListener('online', () => {
// 立即触发同步
});


3. 实在要做后台同步,只能考虑用推送通知+本地存储。iOS支持推送通知,用户点击通知时再触发同步逻辑。

4. 终极方案是直接提示用户"网络不稳定,请保持应用在前台",虽然用户体验差但最可靠。

建议先实现方案2,性能开销最小。如果用户量大了再考虑加轮询兜底。iOS这尿性,我们也只能适应了。
点赞
2026-03-07 23:03