在后台运行一个持久的网络工作者而不会受到限制

问题描述

我想在后台运行一个网络工作者(在移动设备上,它可以在桌面上运行),它通过发送 HTTP 请求每分钟执行一次操作。不幸的是,网站在后台运行约 5 分钟后,将不再发送 HTTP 请求......一旦您返回网站,所有网络请求将恢复。

似乎不允许在后台运行网络工作者,至少在移动设备上不允许,因为它在桌面上运行良好。我找不到任何来源说明为什么它受到限制,以及可以做些什么。我发现了一个类似的 issue 日期为 2017 年,是 4 年前的,没有按照我想要的方式得到答复,也可能已经过时。

我想到了以下解决方案:

  • 通常在原生 Android 中,您可以显示一个通知,以确保您的应用程序在后台继续运行,我想知道这是否也适用于与网络工作者结合使用的网络。
  • 如果你在你的网络工作者中打开一个网络套接字,它会让你的网络工作者在后台保持活动吗?
  • 渐进式网络应用。不幸的是,它似乎并没有保持活跃..

有什么我可以做的吗?

解决方法

所有现代浏览器都限制后台使用。它有一个非常简单的原因:后台任务需要资源,用户不希望后台有一百万个网站吃掉你所有的内存。恶意网站可以使用用户的 CPU 进行比特币挖掘等。

但是有一种方法可以在后台执行操作。您已经在问题中提到了:您需要发送推送通知。您只需在推送通知处理程序中包含一个 fetch()

但这里有一个问题:每次您希望您的网站获取某些内容时,您都必须发送通知,否则您的请求将始终/有时被阻止,具体取决于您的浏览器。 From MDN

激活 Service Worker 以传递推送消息可能会导致资源使用量增加,尤其是电池使用量。不同的浏览器对此有不同的处理方案,目前还没有标准的机制。 Firefox 允许向应用程序发送有限数量(配额)的推送消息,但生成通知的推送消息不受此限制。每次访问站点时都会刷新限制。相比之下,Chrome 没有任何限制,但要求每条推送消息都会显示一条通知。

您只需要设置推送通知。如果您不知道如何设置推送通知,可以关注a great guide from Google

Service Worker 中的实现如下所示:

self.addEventListener('push',function(event) {
  if (!(self.Notification && self.Notification.permission === 'granted')) {
    return;
  }

  // The HTTP request
  fetch("...");

  var data = {};
  if (event.data) {
    data = event.data.json();
  }
  var title = data.title || "Background activity";
  var message = data.message || "You can ignore this";
  var icon = "images/new-notification.png";

  var notification = new Notification(title,{
    body: message,tag: 'simple-push-demo-notification',icon: icon
  });

  notification.addEventListener('click',function() {
    if (clients.openWindow) {
      clients.openWindow('https://example.blog.com/2015/03/04/something-new.html');
    }
  });
});

(复制代码from MDN