即使浏览器关闭,Service Worker是否会在后台运行?

37

我只有在打开Chrome浏览器时才能收到Facebook网页的推送通知。我知道这些通知是通过service worker发送的。我想知道,即使浏览器关闭了,这个后台同步是否仍在进行,还是只有在打开Chrome浏览器时这些服务工作者同步进程才会开始并开始发送推送通知。


3
是的,那就是它们的用途。 - Jonas Wilms
@Jonasw 如何使它们进入非活动状态? - Jagajit Prusty
https://dev59.com/BVkT5IYBdhLWcg3wG8H4 - Kevin Farrugia
@KevinFarrugia 我知道一旦浏览器启动,推送通知就会开始弹出。但我的问题是,即使浏览器关闭了,服务工作者的后台同步是否仍然会运行? - Jagajit Prusty
@JagajitPrusty 请使用最新版本的Chrome\Firefox尝试此演示 https://wicg.github.io/BackgroundSync/demo/ 打开飞行模式。点击注册后台同步。然后关闭浏览器。然后禁用飞行模式。您应该会看到一个通知。 - Kirill Reznikov
显示剩余2条评论
4个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
24

首先,需要说明的是这取决于平台。我的理解是:

在像Windows和Mac OS X这样的桌面平台上,浏览器需要运行一些后台进程才能使服务工作者运行。在Mac OS X上,这很容易检测到,因为浏览器可能没有窗口打开,但浏览器仍然有闪烁的点。

在移动平台上,更容易监听事件并以高效的方式处理它们,因此在这些情况下,平台可以唤醒浏览器,然后处理任何相应的事件。

以上适用于任何服务工作者API。

在桌面端:如果浏览器完全关闭,则服务工作者将无法运行,并且不会分派任何事件(即没有推送或后台同步事件)。

在移动端:事件仍将被分派(即当用户设备联机时,后台同步将触发,推送将被接收并引发推送事件)。


1
我在 Google 工作,虽然我对 Chrome 的工作原理有很好的理解,但它是一个不断发展的产品,变化非常快。谢谢提醒,看起来我的 letsencrypt 脚本出了问题。 - Matt Gaunt
@GauntFace 如果在 Chrome 下面有一个点,那么它仍在运行,因此根据我的理解,服务工作者仍然可以执行后台同步。但我的问题是,如果 Chrome 完全关闭,服务工作者能否执行后台同步? - Jagajit Prusty
更新为明确回答“不”。 - Matt Gaunt
感谢您的解释。请问这里是否可以给一些提示: https://stackoverflow.com/questions/58258677/how-can-i-wake-up-service-worker-when-browser-closed - Hhovhann

4

我认为如果浏览器关闭了,Service Worker 将无法运行。因为只有在我打开浏览器后,Service Worker 才能发送推送通知。如果它在后台运行,则即使关闭浏览器,它也可以发送通知。


在w3c文档(https://w3c.github.io/ServiceWorker/#user-agent-shutdown)中还指出,用户代理应在关机时存储服务工作者状态。在我看来,这意味着如果用户代理关闭,则服务工作者将无法工作。 - gosua
@gosua,您能否稍微解释一下并给出详细的答案呢? - Jagajit Prusty
在规范中,我找不到比这些句子更详细的信息。 "用户代理程序即将关闭后必须存储状态" 对我来说听起来非常像如果用户代理成功关闭,则 Service Worker 将不再存在。 - gosua

0
在桌面上接收推送消息的情况下,只有当浏览器正在运行且在图标下方有标记时,您才会收到消息。 这意味着即使浏览器没有打开任何窗口,您仍然可以在服务工作者中接收到推送消息,因为浏览器在后台运行。 唯一无法接收推送的时间是当浏览器完全关闭时,即根本没有运行(没有标记)。对于Windows也是如此,尽管确定Chrome是否在后台运行有点棘手。

来源 https://web.dev/push-notifications-faq/#why-doesn't-push-work-when-the-browser-is-closed


0

有点离题,但是可以编写Chrome扩展程序,在设置中允许Chrome在后台运行(可配置),背景脚本也可以运行。它还可以使用GCM


我想了解Service Worker的默认行为。如果我们关闭Chrome,Service Worker会运行吗? - Jagajit Prusty
我已经测试过,即使Chrome已关闭(但在后台运行),Service Worker仍在运行。我可以发送推送通知,Worker成功显示了通知。 - Martin Ždila
但是我从未在关闭Chrome时看到过通知。一旦我打开Chrome,来自不同公司(如Facebook、Google)的所有推送通知都开始轰炸我的屏幕。因此,我认为当浏览器关闭时,服务工作者不会运行。 - Jagajit Prusty
@PJagajitPrusty 我刚刚发现在Chrome中必须安装至少一个具有“background”权限的扩展程序才能使其正常工作。然后我在系统托盘(Linux,Xfce)中看到了Chrome图标。 - Martin Ždila

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,