在后台运行持久的 Web Worker 而不会受到限制

Jas*_*son 6 javascript xmlhttprequest web-worker service-worker progressive-web-apps

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

似乎网络工作者不允许在后台运行,至少在移动设备上不允许,因为它在桌面上运行良好。我找不到任何消息来源说明为什么它受到限制以及可以采取什么措施。我在 2017 年发现了一个类似的问题,那是 4 年前的事了,但没有得到我想要的答案,而且可能已经过时了。

我想到了以下解决方案:

  • 通常在原生 Android 中,您可以显示一条通知,以确保您的应用程序在后台持续运行,我想知道这是否也可以与 Web Worker 一起在 Web 上运行。
  • 如果您在 Web Worker 中打开 Web 套接字,它会让您的 Web Worker 在后台保持活动状态吗?
  • 渐进式网络应用程序。不幸的是,似乎没有保持活跃状态​​。

对此我能做些什么吗?

lxh*_*hom 5

所有现代浏览器都限制后台使用。它有一个非常简单的原因:后台任务需要资源,而用户不希望后台有一百万个网站耗尽您的所有 RAM。恶意网站可能会利用用户的 CPU 进行比特币挖矿等。

但有一种方法可以在后台做一些事情。您已经在问题中提到过:您需要发送推送通知。fetch()您只需在推送通知处理程序中包含一个即可。

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

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

您只需要设置推送通知。如果您不知道如何设置推送通知,可以按照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');
    }
  });
});
Run Code Online (Sandbox Code Playgroud)

(代码复制自MDN