10

我一直在这里阅读 Chrome 实现 Web Push API 的文档,我注意到 API 说“你承诺在收到推送时显示通知”,并且在限制下它说“你必须在您收到一条推送消息”。

在我的本地主机上实现示例后,我使用 cURL 成功发送了推送通知。我很好奇,所以我注释掉了实际调用 showNotification 函数的行,并放入了一个 console.log,发现实际上我可以发送、接收和完全忽略推送通知。我什至尝试使用 if 语句来控制是否根据我从主页控制的全局布尔值来显示它们,并且有效。所以我想知道是否有人知道他们说你需要显示通知是什么意思,而无声推送通知不可用?

这不仅仅是为了它,我合法地可能需要控制是否在我的网络应用程序中显示这些通知,所以如果这实际上是可能的,那就太好了。下面的代码,以防你好奇。

self.addEventListener('push', function(event) {
  var title = 'New Message';
  var body = 'You have received a new message!';
  var icon = '/img/favicon.png';
  var tag = 'well-notification';
  console.log("DID RECEIVE NOTIFICATION")

  if(settingsShowNotification) {
    event.waitUntil(
      self.registration.showNotification(title, {
         body: body,
         icon: icon,
         tag: tag
      })
    );
  }
});

编辑:在 Chrome 47 上,如果相关的话。

更新:经过进一步实验,我发现了一个明显的问题,即一旦用户离开然后重新导航到同一页面,我就无法更新原始全局变量。但是,我能够使用 serviceworker 本身的变量来规避这个问题,并使用此处描述的 API 向 service worker 发送消息来切换 showNotifications 布尔值。

4

1 回答 1

14

您必须显示通知,如果您不显示通知,您会收到来自浏览器的强制通知,显示“此站点已在后台更新”。但是显示可怕信息的要求已经稍微放宽了:

截至 16 年 1 月,似乎最多检查最后 10 个通知是否每个都显示通知。如果最后十个通知中的一个通知没有显示通知,则视为意外,浏览器不会显示可怕的“此站点已在后台更新”。您必须错过最后十个通知中的两个通知才能出现可怕的消息。

注意:如果活动浏览器选项卡的地址栏中的 URL 与您的页面来源匹配,并且浏览器最小化,则不需要显示通知。如果您在运行测试时位于页面本身,这可能就是您的测试成功的原因。

跟踪实现的 Chromium 错误:https ://code.google.com/p/chromium/issues/detail?id=437277

相关源码行:https ://code.google.com/p/chromium/codesearch#chromium/src/chrome/browser/push_messaging/push_messaging_notification_manager.cc&l=249

于 2016-01-27T18:43:32.843 回答