为什么在关闭浏览器后推送不起作用?
这个问题经常出现,主要是因为有些场景难以推理和理解。
我们先从 Android 开始。Android OS 旨在监听推送消息,并在收到推送消息时唤醒相应的 Android 应用来处理推送消息,无论该应用处于开启还是关闭状态。
这与 Android 上的任何浏览器完全相同,浏览器会在收到推送消息时被唤醒,然后浏览器会唤醒您的服务工件并分派推送事件。
在桌面操作系统上,情况更为复杂,在 Mac OS X 上最容易解释,因为它有一个直观的指示器来帮助解释不同的场景。
在 Mac OS X 中,您可以通过底部栏中应用图标下的标记来判断程序是否正在运行。
如果您比较以下程序坞中的两个 Chrome 图标,就会发现左侧的图标正在运行(如图标下方的标记所示),而右侧的 Chrome 未运行,因此下方没有标记。

在桌面设备上接收推送消息时,您将在浏览器运行(即图标下方有标记)时收到消息。
这意味着,浏览器可以没有打开任何窗口,您仍然会在服务工件中收到推送消息,因为浏览器在后台运行。
只有在浏览器完全关闭(即完全不运行 [无标记])时,才不会收到推送。同样的,Windows 也是如此,不过确定 Chrome 是否在后台运行要稍微复杂一些。
如何让我的主屏幕 Web 应用在收到推送后以全屏模式打开?
在 Android 版 Chrome 中,您可以将 Web 应用添加到主屏幕,从主屏幕打开 Web 应用时,该应用可在全屏模式下启动,且不显示网址栏,如下所示。

为了保持一致的体验,开发者希望用户点击的通知也能以全屏方式打开其 Web 应用。
Chrome 已“大致”实现了此功能,但您可能会发现它不可靠且难以推理。相关实现详情如下:
这意味着,除非用户经常通过主屏幕图标访问您的网站,否则您的通知将在正常的浏览器界面中打开。
我们会进一步研究此问题。
为什么这比 Web 套接字更好?
在浏览器窗口关闭时,可以启动服务工件。只有在浏览器和网页保持打开状态时,网络套接字才会保持有效状态。
GCM、FCM、网站推送和 Chrome 之间有什么关系?
这个问题有很多方面,最简单的解释方法是逐步介绍 Web Push 和 Chrome 的历史。(别担心,很短。)
2014 年 12 月
在 Chrome 首次实现网页推送时,Chrome 使用 Google 云消息传递 (GCM) 来支持从服务器向浏览器发送推送消息。
这不是网站推送。这种早期 Chrome 和 GCM 设置不是“真正的”网站推送,原因有以下几点。
- GCM 要求开发者在 Google 开发者控制台中设置账号。
- Chrome 和 GCM 需要 Web 应用共享一个特殊的“发件人 ID”,才能正确设置消息传递。
- GCM 的服务器接受了非 Web 标准的自定义 API 请求。
2016 年 7 月
7 月,Web 推送推出了一项新功能:应用服务器密钥(或称为 VAPID 规范)。当 Chrome 添加对此新 API 的支持后,它使用 Firebase Cloud Messaging(也称为 FCM)而非 GCM 作为消息传递服务。这点非常重要,原因如下:
- 使用 Chrome 和应用服务器密钥时,无需在 Google 或 Firebase 中设置任何类型的项目。它会正常运行。
- FCM 支持Web Push 协议,这是所有 Web Push 服务都将支持的 API。这意味着,无论浏览器使用哪种推送服务,您只需发出相同类型的请求,浏览器就会发送消息。
为什么今天会感到困惑?
目前,关于 Web 推送的相关内容已经有很多,其中大部分都提及了 GCM 或 FCM。如果内容引用了 GCM,您可能应该将其视为内容过时或过于侧重于 Chrome 的标志。(我自己在许多旧帖子中就犯过这个错误。)
不过,您可以将 Web Push 视为由浏览器和推送服务组成,浏览器使用推送服务来管理发送和接收消息,而推送服务会接受“Web Push 协议”请求。从这个角度来看,您可以忽略它使用的是哪款浏览器和哪项推送服务,直接开始工作。
本指南旨在重点介绍 Web 推送的标准方法,并有意忽略任何其他内容。
Firebase 提供了 JavaScript SDK。什么?为什么?
如果您发现了 Firebase Web SDK 并注意到它有一个适用于 JavaScript 的消息传递 API,可能就会想知道它与 Web 推送有何不同。
消息传递 SDK(称为 Firebase Cloud Messaging JS SDK)会在后台执行一些技巧,以便您更轻松地实现 Web 推送。
- 您无需担心
PushSubscription
及其各种字段,只需关注 FCM 令牌(字符串)即可。 - 使用每位用户的令牌,您可以使用专有 FCM API 触发推送消息。此 API 不需要对载荷进行加密。您可以在 POST 请求正文中发送纯文本载荷。
- FCM 的专有 API 支持自定义功能,例如 FCM Topics(它也适用于 Web,但文档不太详尽)。
- 最后,FCM 支持 Android、iOS 和 Web,因此对于某些团队来说,在现有项目中使用 FCM 会更容易。
这在后台使用 Web Push,但其目标是将其抽象化。
就像我在上一个问题中所说,如果您将 Web 推送仅视为浏览器和推送服务,那么您可以将 Firebase 中的 Messaging SDK 视为一个库,以简化 Web 推送的实现。
下一步做什么
- 网页推送通知概览
- 推送通知的运作方式
- 为用户订阅
- 权限用户体验
- 使用 Web 推送库发送消息
- Web 推送协议
- 处理推送事件
- 显示通知
- 通知行为
- 常见通知模式
- 推送通知常见问题解答
- 常见问题和报告错误