跳转到内容

Periodic background sync:在应用关闭时刷新内容

一句话: Periodic background sync(周期性后台同步)让 web 应用的 service worker 在后台周期性 地同步数据,使 PWA 能在启动时立即展示新内容,而不必让用户等待抓取过程。

周期性后台同步会在应用或页面未被使用时在后台下载数据,因此应用内容在用户打开它时不需要再刷新——也 不需要在刷新前展示加载动画。这与(非周期性的)background sync 不同:background sync 最常见的用例 是在此前的请求失败后向服务器重新发送数据;而周期性后台同步是主动刷新内容,而非重试失败的请求。

该 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());
}
});

Chrome 只允许 web 应用在用户已将其安装到设备上、并作为独立应用启动之后使用周期性后台同步——它在 普通浏览器标签页的上下文中不可用。由于 Chrome 不希望未使用或很少使用的 web 应用白白消耗电量或流 量,它还会在授予该能力之前,根据用户对已安装应用的使用度进行限定。

  • 在调用 register() 之前,先用 'periodicSync' in registration 做特性检测。
  • 只在已安装并作为独立应用启动(而非仅在标签页中)的 PWA 上依赖周期性后台同步——它在普通浏览 器标签页中不可用。
  • 传入合理的 minInterval;实际的同步频率由浏览器(而非你的应用)根据使用度等信号决定。
  • 为独立的周期性任务使用不同的 tag 值,并在 periodicsync 处理器中检查 event.tag
  • 把推送通知留给真正重要、面向用户的更新;用周期性同步来做常规的内容刷新。