为什么在浏览器关闭后推送消息不起作用?
这个问题急剧出现,主要是因为有些场景很难推断和理解。
我们先从 Android 开始。Android 操作系统旨在监听推送消息,并且在收到推送消息后,会唤醒相应的 Android 应用来处理推送消息(无论应用是否关闭)。
这与 Android 上的任何浏览器都一样,在收到推送消息时,浏览器将被唤醒,然后浏览器将唤醒您的 Service Worker 并分派推送事件。
在桌面操作系统中,这个问题更为微妙,在 Mac OS X 上解释也最简单,因为有一个直观的指示符有助于解释不同的场景。
在 Mac OS X 上,您可以通过 Dock 中应用图标下方的标记来判断某个程序是否正在运行。
如果您比较以下基座中的两个 Chrome 图标,会发现左侧的图标正在运行(如图标下方的标记所示),而右侧的 Chrome 未运行,因此下方没有标记。
![OS X 示例](https://web.developers.google.cn/static/articles/push-notifications-faq/image/example-os-x-72bc3d5fa52ff.png?authuser=8&hl=cs)
在桌面设备上接收推送消息的上下文中,您将在浏览器运行时收到消息,即图标下方带有标记。
这意味着浏览器不能打开任何窗口,您仍会在 Service Worker 中收到推送消息,因为浏览器在后台运行。
只有在浏览器完全关闭时,即完全没有运行(不做标记)时收不到推送。这同样适用于 Windows,但确定 Chrome 是否在后台运行不太容易。
如何使我的主屏幕 Web 应用从推送时全屏打开?
在 Android 版 Chrome 中,可将某款 Web 应用添加到主屏幕;当该 Web 应用从主屏幕打开时,该应用可在没有网址栏的情况下以全屏模式启动,如下所示。
![主屏幕图标切换为全屏](https://web.developers.google.cn/static/articles/push-notifications-faq/image/home-screen-icon-fullscr-e034b276ccc7e.png?authuser=8&hl=cs)
为了保持这种体验的一致性,开发者也希望他们点击的通知能够以全屏模式打开其 Web 应用。
Chrome“有点”实现了这一点,但您可能会发现它不可靠且难以推断。相关的实现详情如下:
这意味着,除非用户经常通过主屏幕图标访问您的网站,否则通知将在正常的浏览器界面中打开。
我们会进一步处理此问题。
为什么这比 Web 套接字更佳?
Service Worker 可以在浏览器窗口关闭后生效。只要浏览器和网页保持打开状态,Web 套接字就会一直存在。
GCM、FCM、Web Push 和 Chrome 分别适用于什么?
这个问题涉及许多方面,最简单的解释方法是逐步浏览 Web 推送和 Chrome 的历史记录。(别担心,它很短。)
2014 年 12 月
当 Chrome 首次实现 Web 推送时,Chrome 会使用 Google Cloud Messaging (GCM) 为从服务器向浏览器发送推送消息提供支持。
此次操作并非 Web 推送。之所以对 Chrome 和 GCM 进行这种早期设置,并不是“真正的”Web 推送,原因有很多。
- GCM 要求开发者在 Google Developers Console 上设置一个账号。
- Chrome 和 GCM 需要由 Web 应用共享特殊的发送者 ID,才能正确设置消息传递。
- GCM 的服务器接受了不符合网络标准的自定义 API 请求。
2016 年 7 月
7 月,Web 推送推出一项新功能 - 应用服务器密钥(该规范称为 VAPID)。当 Chrome 添加对这个新 API 的支持时,它使用 Firebase Cloud Messaging(也称为 FCM)而非 GCM 作为消息传递服务。这一点很重要,原因如下:
- Chrome 和应用服务器密钥不需要为 Google 或 Firebase 设置任何类型的项目。它就会好用。
- FCM 支持 Web 推送协议,这是所有 Web 推送服务都支持的 API。这意味着,无论浏览器使用什么推送服务,您只需发出同一类请求,浏览器就会发送消息。
为什么现在让人感到困惑?
现在,有关 Web 推送的内容编写了很多混淆,其中大部分引用了 GCM 或 FCM。如果内容引用了 GCM,您可能应该将其视为一种迹象,表明它是旧内容或者过于关注 Chrome。(对于在许多以前的帖子中这样做,我感到非常头疼。)
相反,请将 Web 推送视为由浏览器组成,浏览器使用推送服务来管理消息的发送和接收,推送服务将接受“网络推送协议”请求。如果您用这些术语来思考,就不必考虑它使用的是哪种浏览器以及哪种推送服务,然后开始工作。
本指南重点介绍 Web 推送的标准方法,故意忽略了其他内容。
Firebase 提供 JavaScript SDK。是什么?为什么?
如果您已找到 Firebase Web SDK 并注意到它具有适用于 JavaScript 的 Messaging API,您可能想知道它与 Web 推送有何不同。
Messaging SDK(称为 Firebase Cloud Messaging JS SDK)会在后台执行一些技巧,以便您更轻松地实现 Web 推送。
- 您只需操心 FCM 令牌(一个字符串)即可,无需担心
PushSubscription
及其各种字段。 - 借助每个用户的令牌,您可以使用专有的 FCM API 触发推送消息。此 API 不需要加密载荷。您可以在 POST 请求正文中发送纯文本载荷。
- FCM 的专有 API 支持自定义功能,例如 FCM 主题(它也可以在网页上运行,尽管记录不尽人意)。
- 最后,FCM 支持 Android、iOS 和 Web,因此对于某些团队来说,在现有项目中使用它们会更轻松。
它在后台使用 Web 推送,但其目标是将其抽象出来。
就像我在上一个问题中说的那样,如果您将 Web 推送视为浏览器和推送服务,则可以考虑将 Messaging SDK in Firebase 作为库来简化 Web 推送的实现。