推送通知常见问题解答

为什么当浏览器关闭时推送不起作用?

这个问题经常出现,很大程度上是因为有一些情况使得难以推理和理解。

让我们从 Android 开始。Android 操作系统旨在监听推送消息,并在收到推送消息时唤醒相应的 Android 应用程序来处理推送消息,无论该应用程序是否已关闭。

Android 上的任何浏览器都是如此,当收到推送消息时,浏览器将被唤醒,然后浏览器将唤醒您的 Service Worker 并分发推送事件。

在桌面操作系统上,情况更加微妙,在 Mac OS X 上最容易解释,因为有一个视觉指示器可以帮助解释不同的场景。

在 Mac OS X 上,您可以通过 Dock 中应用程序图标下方的标记来判断程序是否正在运行。

如果您比较以下 Dock 中的两个 Chrome 图标,左侧的图标正在运行,图标下方有标记说明了这一点,而右侧的 Chrome 未运行,因此下方没有标记。

Example of OS X

在桌面接收推送消息的上下文中,当浏览器正在运行时(即图标下方有标记),您将收到消息。

这意味着浏览器可以不打开任何窗口,您仍然会在您的 Service Worker 中收到推送消息,因为浏览器在后台运行。

唯一不会收到推送的情况是浏览器完全关闭时,即根本没有运行(没有标记)。同样适用于 Windows,尽管要确定 Chrome 是否在后台运行有点棘手。

如何让我的主屏幕 Web 应用程序从推送中以全屏模式打开?

在 Android 版 Chrome 上,可以将 Web 应用程序添加到主屏幕,并且当从主屏幕打开 Web 应用程序时,它可以以全屏模式启动,而没有 URL 栏,如下所示。

Home screen Icon to Fullscreen

为了保持这种体验的一致性,开发人员希望他们点击的通知也以全屏模式打开他们的 Web 应用程序。

Chrome “某种程度上”实现了这一点,尽管您可能会发现它不可靠且难以推理。相关的实现细节是

这意味着,除非您的用户经常通过主屏幕图标访问您的网站,否则您的通知将在正常的浏览器 UI 中打开。

这个问题将进一步处理。

这比 Web 套接字好在哪里?

当浏览器窗口关闭时,可以激活 Service Worker。Web 套接字只能在浏览器和网页保持打开状态时存在。

GCM、FCM、Web Push 和 Chrome 之间有什么关系?

这个问题有很多方面,最简单的解释方法是回顾 Web Push 和 Chrome 的历史。(别担心,很短。)

2014 年 12 月

当 Chrome 首次实现 Web Push 时,Chrome 使用 Google Cloud Messaging (GCM) 来支持从服务器到浏览器发送推送消息。

不是 Web Push。Chrome 和 GCM 的早期设置不是“真正的”Web Push 有几个原因。

  • GCM 要求开发人员在 Google Developers Console 上设置帐户。
  • Chrome 和 GCM 需要一个特殊的发送者 ID,Web 应用程序需要共享该 ID 才能正确设置消息传递。
  • GCM 的服务器接受自定义 API 请求,这不是 Web 标准。

2016 年 7 月

7 月,Web Push 中新增了一项功能 - 应用程序服务器密钥(或 VAPID,正如规范所知)。当 Chrome 添加对这个新 API 的支持时,它使用了 Firebase Cloud Messaging(也称为 FCM)而不是 GCM 作为消息传递服务。这很重要,原因如下

  • Chrome 和应用程序服务器密钥不需要在 Google 或 Firebase 上设置任何类型的项目。它就可以工作。
  • FCM 支持 Web Push 协议,这是所有 Web Push 服务将支持的 API。这意味着,无论浏览器使用什么推送服务,您只需发出相同类型的请求,它就会发送消息。

为什么今天会感到困惑?

现在,关于 Web Push 主题的内容已经编写了很多,其中大部分都引用了 GCM 或 FCM,因此现在存在大量困惑。如果内容引用了 GCM,您可能应该将其视为表明它是旧内容,或者它过于关注 Chrome。(我承认在许多旧帖子中都这样做过。)

相反,将 Web Push 视为由浏览器组成,该浏览器使用推送服务来管理消息的发送和接收,其中推送服务将接受“Web Push 协议”请求。如果您以这些术语思考,您可以忽略浏览器和它使用的推送服务,并开始工作。

本指南的编写重点是 Web Push 的标准方法,并有意忽略其他任何内容。

Firebase 有一个 JavaScript SDK。是什么,为什么?

对于那些发现 Firebase Web SDK 并注意到它有一个用于 JavaScript 的消息传递 API 的人来说,您可能想知道它与 Web Push 有何不同。

消息传递 SDK(称为 Firebase Cloud Messaging JS SDK)在幕后做了一些技巧,使 Web Push 的实现更容易。

  • 您不必担心 PushSubscription 及其各种字段,而只需担心 FCM 令牌(一个字符串)。
  • 使用每个用户的令牌,您可以使用专有的 FCM API 来触发推送消息。此 API 不需要加密有效负载。您可以在 POST 请求正文中发送纯文本有效负载。
  • FCM 的专有 API 支持自定义功能,例如 FCM 主题(它也适用于 Web,尽管文档记录不完善)。
  • 最后,FCM 支持 Android、iOS 和 Web,因此对于某些团队来说,在现有项目中更容易使用。

这在幕后使用了 Web Push,但其目标是将其抽象化。

正如我在上一个问题中所说,如果您将 Web Push 仅视为浏览器和推送服务,那么您可以将 Firebase 中的 Messaging SDK 视为简化 Web Push 实现的库。

下一步去哪里

代码实验室