ServiceWorkerRegistration - 表示对服务工作线程注册的管理

ServiceWorkerRegistrationServiceWorker API 的接口,表示对服务工作线程注册的管理。您可以注册一个服务工作线程来控制共享相同源的一个或多个页面。

浏览器维护了一个活跃的 ServiceWorkerRegistration 对象的持久列表。

注意Web Workers 中提供了此功能。

属性

还从其父接口 EventTarget 继承了属性。

ServiceWorkerRegistration.scope 只读

返回服务工作线程注册的唯一标识符。该地址必须与注册 ServiceWorker 的文档的来源相同。

ServiceWorkerRegistration.installing 只读

返回状态为 installing 的服务工作线程。初始值为 null

ServiceWorkerRegistration.waiting 只读

返回状态为 installed 的服务工作线程。初始值为 null

ServiceWorkerRegistration.active 只读

返回状态为 activatingactivated 的服务工作线程。初始值为 null。如果客户端的 URL 在注册范围内(第一次调用 ServiceWorkerContainer.register 时设置的 scope 选项),则活动的工作线程将控制 ServiceWorkerClient

ServiceWorkerRegistration.navigationPreload 只读

返回与当前服务工作线程注册关联的 NavigationPreloadManager 的实例。

ServiceWorkerRegistration.pushManager 只读

返回对 PushManager 接口的引用,用于管理推送订阅,包括订阅,获取活动订阅和访问推送许可状态。

ServiceWorkerRegistration.sync 只读

返回对 SyncManager 接口的引用,该接口管理后台同步过程。

未实现属性

serviceWorkerRegistration.periodicSync 只读

返回对 PeriodicSyncManager 接口的引用,该接口管理周期性的后台同步过程。在某些时候,SW 解释器中曾提到过这个想法,但至今尚未在任何地方实现。

事件处理程序

ServiceWorkerRegistration.onupdatefound 只读

一个 EventListener 属性,每当触发 updatefound 类型的事件时,就会调用;只要 ServiceWorkerRegistration.installing 属性获得新的服务工作线程,就会触发该事件。

方法

还从其父接口 EventTarget 继承了方法。

ServiceWorkerRegistration.getNotifications()

返回一个 Promise,解析为 Notification 对象数组。

ServiceWorkerRegistration.showNotification()

显示带有指定标题的通知。

ServiceWorkerRegistration.update()

在不查询缓存的情况下,检查服务器是否有服务工作线程的更新版本。

ServiceWorkerRegistration.unregister()

注销服务工作线程的注册,并返回一个 Promise。服务工作线程将在注销之前完成所有正在进行的操作。

实例

在此实例中,代码首先检查浏览器是否支持服务工作线程,如果支持,则进行注册。接下来,它添加一个 updatefound 监听器,该监听器在其中使用服务工作线程注册来监听对服务工作线程状态的进一步更改。如果服务工作线程自上次注册以来从未更改过,则不会触发 updatefound 事件。

if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/sw.js')
  .then(function(registration) {
    registration.addEventListener('updatefound', function() {
      // 如果 updatefound 被触发,则意味着正在安装新的服务程序。
      var installingWorker = registration.installing;
      console.log('正在安装新的服务工作线程:',
        installingWorker);

      // 您可以通过 installWorker.onstatechange 监听对安装服务工作线程状态的更改。
    });
  })
  .catch(function(error) {
    console.log('服务人员线程失败:', error);
  });
} else {
  console.log('不支持服务工作线程。');
}

规范

规范 状态 备注
Service Workers
ServiceWorkerRegistration 的定义
工作草案 初始定义。
Push API
PushManager 的定义
工作草案 添加 pushManager 属性。
Notifications API 现行的标准 添加 showNotification()getNotifications() 方法。
Web Background Synchronization 现行的标准 添加 sync 属性。

桌面浏览器兼容性

特性ChromeEdgeFirefoxInternet ExplorerOperaSafari
基础支持40

17

16

441 不支持2711.1
active40

17

16

441 不支持2711.1
getNotifications40

17

16

461 不支持2711.1
installing40

17

16

441 不支持2711.1
navigationPreload59

17

16

441 不支持4611.1
onupdatefound40

17

16

441 不支持2711.1
paymentManager56 未知 未知 不支持 支持 未知
periodicSync 不支持 不支持 不支持 不支持 不支持 不支持
pushManager40

17

16

441 不支持2711.1
scope40

17

16

441 不支持2711.1
showNotification40

17

16

461 不支持27 不支持
sync49 未知 不支持 不支持36 不支持
unregister40

17

16

441 不支持2711.1
update4523

17

16

441 不支持324511.1
updateViaCache681857 不支持 支持11.1
waiting40

17

16

441 不支持2711.1

移动浏览器兼容性

特性AndroidChrome for AndroidEdge mobileFirefox for AndroidIE mobileOpera AndroidiOS Safari
基础支持4040 未知44 未知2711.3
active4040 未知44 未知2711.3
getNotifications 不支持40 未知46 未知2711.3
installing4040 未知44 未知2711.3
navigationPreload5959 未知44 未知4311.3
onupdatefound4040 未知44 未知2711.3
paymentManager 支持56 未知 未知 未知 支持 未知
periodicSync 不支持 不支持 未知 不支持 未知 不支持 不支持
pushManager 不支持40 未知44 未知2711.3
scope4040 未知44 未知27 不支持
showNotification4040 未知46 未知27 不支持
sync4949 未知 不支持 未知36 不支持
unregister4040 未知44 未知2711.3
update45234523 未知44 未知3245 不支持
updateViaCache6868 未知57 未知 支持 支持
waiting4040 未知44 未知27 不支持

1. 在 Firefox 45 和 52 扩展支持版本(ESR)中,服务 worker(和 Push)已被禁用。

2. 从 Chrome 46 开始,update() 返回一个 promise,如果操作成功完成或没有更新,则以解析为 undefined,如果更新失败,则拒绝。如果新工作程序运行但安装失败,则承诺仍会解析。之前,它会触发一个异常。

3. 在 Chrome 48 之前,此方法始终绕过浏览器缓存。从 Chrome 48 开始,只有在上一个服务工作线程检查超过 24 小时之前,它才会绕过缓存。

4. 从 Opera 33 开始,update() 返回一个 promise,如果操作成功完成或没有更新,则以解析为 undefined,如果更新失败,则拒绝。如果新工作程序运行但安装失败,则承诺仍会解析。之前,它会触发一个异常。

5. 在 Opera 35 之前,此方法始终绕过浏览器缓存。从 Opera 35 开始,只有在上一个服务工作线程检查超过 24 小时之前,它才会绕过缓存。

相关链接