推送通知常见问题解答

Matt Gaunt

为什么浏览器关闭时推送功能无法正常运行?

这个问题经常出现,主要是因为在某些情况下,很难进行推理和理解。

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

这与 Android 上的任何浏览器完全相同,浏览器将在收到推送消息时被唤醒,然后浏览器将唤醒您的 Service Worker 并分派推送事件。

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

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

如果您比较以下程序坞中的两个 Chrome 图标,左侧的图标正在运行,如图标下方的标记所示,而右侧的 Chrome 未运行,因此下方没有标记。

OS X 示例

在桌面设备上接收推送消息时,您会在浏览器运行时(即图标下方有标记)收到消息。

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

只有在浏览器完全关闭(即根本没有运行,无标记)时,才不会收到推送。Windows 也是如此,不过要确定 Chrome 是否在后台运行,难度要稍微大一些。

如何让主屏幕 Web 应用通过推送通知以全屏模式打开?

在 Chrome for Android 上,Web 应用可以添加到主屏幕,当从主屏幕打开 Web 应用时,它可以在没有网址栏的情况下以全屏模式启动,如下所示。

主屏幕图标到全屏

为了保持这种体验的一致性,开发者希望用户点击通知后,也能以全屏模式打开其 Web 应用。

Chrome“在某种程度上”实现了这一点,但您可能会发现它不可靠且难以理解。相关实现细节如下:

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

我们将进一步解决此问题。

为什么这比 Web Socket 更好?

当浏览器窗口关闭时,Service Worker 可以启动。只要浏览器和网页保持打开状态,Web Socket 就会一直存在。

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

这个问题涉及多个方面,最简单的解释方法是逐步了解网络推送和 Chrome 的历史。(别担心,内容很简短。)

2014 年 12 月

Chrome 首次实现网页推送时,使用的是 Google Cloud Messaging (GCM) 来支持从服务器向浏览器发送推送消息。

这不是网络推送。Chrome 和 GCM 的这种早期设置并非“真正”的 Web 推送,原因有以下几点。

  • GCM 要求开发者在 Google Developers Console 上设置账号。
  • Chrome 和 GCM 需要一个由 Web 应用共享的特殊发送者 ID,才能正确设置消息传递。
  • GCM 的服务器接受了不属于 Web 标准的自定义 API 请求。

2016 年 7 月

7 月,Web 推送中推出了一项新功能 - 应用服务器密钥(或 VAPID,如规范中所述)。Chrome 在添加对这一新 API 的支持时,使用了 Firebase Cloud Messaging(也称为 FCM)而非 GCM 作为消息传递服务。这一点很重要,原因如下:

  • Chrome 和应用服务器密钥不需要在 Google 或 Firebase 中设置任何类型的项目。它会正常运行。
  • FCM 支持网络推送协议,这是所有网络推送服务都将支持的 API。这意味着,无论浏览器使用何种推送服务,您只需发出相同类型的请求,它就会发送消息。

为什么现在会让人感到困惑?

现在,由于已经撰写了大量有关网络推送主题的内容,其中许多内容都引用了 GCM 或 FCM,因此存在大量混淆。如果内容提及 GCM,您可能应该将其视为旧内容,或者过于关注 Chrome。(我曾在许多旧帖子中犯过这个错误。)

相反,您可以将 Web 推送视为由浏览器组成,浏览器使用推送服务来管理消息的发送和接收,其中推送服务将接受“Web 推送协议”请求。如果您从这些方面考虑,则可以忽略它使用的是哪个浏览器和哪个推送服务,然后开始工作。

本指南重点介绍 Web 推送的标准方法,并有意忽略了其他所有内容。

Firebase 提供了 JavaScript SDK。是什么?为什么?

如果您已经了解 Firebase Web SDK,并注意到它有一个 JavaScript 消息传递 API,您可能会想知道它与 Web 推送有何不同。

Messaging SDK(称为 Firebase Cloud Messaging JS SDK)在后台执行了一些操作,以便更轻松地实现 Web 推送。

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

它在后台使用 Web 推送,但其目标是将其抽象化。

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

下一步做什么

Codelab