Periodic background sync:在应用关闭时刷新内容
一句话: Periodic background sync(周期性后台同步)让 web 应用的 service worker 在后台周期性 地同步数据,使 PWA 能在启动时立即展示新内容,而不必让用户等待抓取过程。
周期性后台同步会在应用或页面未被使用时在后台下载数据,因此应用内容在用户打开它时不需要再刷新——也 不需要在刷新前展示加载动画。这与(非周期性的)background sync 不同:background sync 最常见的用例 是在此前的请求失败后向服务器重新发送数据;而周期性后台同步是主动刷新内容,而非重试失败的请求。
注册与事件 API
Section titled “注册与事件 API”该 API 通过 ServiceWorkerRegistration.periodicSync 访问,它返回一个 PeriodicSyncManager:
const registration = await navigator.serviceWorker.ready;if ('periodicSync' in registration) { try { await registration.periodicSync.register('get-latest-news', { minInterval: 24 * 60 * 60 * 1000, }); } catch { console.log('Periodic Sync could not be registered!'); }}PeriodicSyncManager.register(tag, options)使用给定的 tag 和minInterval(毫秒)注册一个 周期性同步请求,返回的 Promise 在注册完成后 resolve。PeriodicSyncManager.getTags()resolve 为当前已注册的 tag 列表。PeriodicSyncManager.unregister(tag)移除此前注册的某个 tag。
在 service worker 中,应用监听 periodicsync 事件,PeriodicSyncEvent.tag 标识触发的是哪个注册
(多个 tag 可以驱动不同频率的不同任务):
self.addEventListener('periodicsync', (event) => { if (event.tag === 'get-latest-news') { event.waitUntil(fetchAndCacheLatestNews()); }});可用性受安装与使用度约束
Section titled “可用性受安装与使用度约束”Chrome 只允许 web 应用在用户已将其安装到设备上、并作为独立应用启动之后使用周期性后台同步——它在 普通浏览器标签页的上下文中不可用。由于 Chrome 不希望未使用或很少使用的 web 应用白白消耗电量或流 量,它还会在授予该能力之前,根据用户对已安装应用的使用度进行限定。
- 在调用
register()之前,先用'periodicSync' in registration做特性检测。 - 只在已安装并作为独立应用启动(而非仅在标签页中)的 PWA 上依赖周期性后台同步——它在普通浏览 器标签页中不可用。
- 传入合理的
minInterval;实际的同步频率由浏览器(而非你的应用)根据使用度等信号决定。 - 为独立的周期性任务使用不同的
tag值,并在periodicsync处理器中检查event.tag。 - 把推送通知留给真正重要、面向用户的更新;用周期性同步来做常规的内容刷新。
- Service Worker 生命周期 — 这个 API 所依附的注册对象
- Cache API —
periodicsync处理器通常用来存放刷新后 内容的地方