在深入了解 API 之前,让我们从宏观层面了解一下推送的整个过程。然后,当我们逐步学习后面的各个主题或 API 时,您将了解它为何如此重要。
实现推送的三个关键步骤是:
- 添加客户端逻辑以让用户订阅推送(即,您的 Web 应用中用于注册用户以接收推送消息的 JavaScript 和 UI)。
- 从您的后端/应用发出的 API 调用,用于触发向用户设备推送消息。
- Service Worker JavaScript 文件,用于在推送到达设备时接收“push event”。您可以在此 JavaScript 中显示通知。
让我们更详细地了解一下每个步骤都包含哪些内容。
步骤 1:客户端
第一步是“订阅”用户以接收推送消息。
订阅用户需要做两件事。首先,获得用户许可,才能向他们发送推送消息。其次,从浏览器获取 PushSubscription
。
PushSubscription
包含我们需要向该用户发送推送消息的所有信息。您可以“大致”将其视为该用户设备的 ID。
这一切都在 JavaScript 中通过 Push API 完成。
在订阅用户之前,您需要生成一组“应用服务器密钥”,我们将在后面介绍。
应用服务器密钥也称为 VAPID 密钥,对于您的服务器是唯一的。它们允许推送服务知道哪个应用服务器订阅了用户,并确保是同一服务器触发了向该用户推送消息。
订阅用户并获得 PushSubscription
后,您需要将 PushSubscription
详细信息发送到您的后端/服务器。在您的服务器上,您将此订阅保存到数据库中,并使用它向该用户发送推送消息。
步骤 2:发送推送消息
当您想向用户发送推送消息时,您需要向推送服务发出 API 调用。此 API 调用将包括要发送的数据、要向谁发送消息以及有关如何发送消息的任何条件。通常,此 API 调用是从您的服务器完成的。
您可能会问自己的一些问题
- 推送服务是谁?是什么?
- API 是什么样子的?是 JSON、XML 还是其他格式?
- API 可以做什么?
推送服务是谁?是什么?
推送服务接收网络请求,对其进行验证,并将推送消息传递到相应的浏览器。如果浏览器处于离线状态,则消息将排队,直到浏览器上线。
每个浏览器都可以使用他们想要的任何推送服务,这是开发者无法控制的。这不是问题,因为每个推送服务都期望相同的 API 调用。这意味着您不必关心推送服务是谁。您只需要确保您的 API 调用有效即可。
要获取触发推送消息的相应 URL(即,推送服务的 URL),您只需要查看 PushSubscription
中的 endpoint
值即可。
以下是您从 PushSubscription 获取的值的示例
{
"endpoint": "https://random-push-service.com/some-kind-of-unique-id-1234/v2/",
"keys": {
"p256dh": "BNcRdreALRFXTkOOUHK1EtK2wtaz5Ry4YfYCA_0QTpQtUbVlUls0VJXg7A8u-Ts1XbjhazAkj7I99e8QcYP7DkM=",
"auth": "tBHItJI5svbpez7KI4CCXg=="
}
}
在本例中,endpoint 是 [https://random-push-service.com/some-kind-of-unique-id-1234/v2/]。推送服务将是“random-push-service.com”,每个 endpoint 对于用户都是唯一的,以“some-kind-of-unique-id-1234”表示。当您开始使用推送时,您会注意到这种模式。
订阅中的 keys 将在后面介绍。
API 是什么样子的?
我提到过,每个 Web 推送服务都期望相同的 API 调用。该 API 是 Web Push Protocol。它是一个 IETF 标准,定义了如何向推送服务发出 API 调用。
API 调用需要设置某些标头,并且数据必须是字节流。我们将研究可以为我们执行此 API 调用的库以及如何自己执行此操作。
API 可以做什么?
API 提供了一种向用户发送消息的方式,可以带数据也可以不带数据,并提供了如何发送消息的说明。
您随推送消息发送的数据必须加密。这样做的原因是,它可以防止推送服务(可能是任何人)查看随推送消息发送的数据。鉴于浏览器决定使用哪个推送服务,这可能会为浏览器使用不安全或不安全的推送服务打开大门,因此这一点很重要。
当您触发推送消息时,推送服务将接收 API 调用并将消息排队。此消息将保持排队状态,直到用户的设备上线并且推送服务可以传递消息。您可以给推送服务的说明定义了推送消息的排队方式。
这些说明包括如下详细信息:
推送消息的生存时间。这定义了消息在被删除且未传递之前应排队多长时间。
定义消息的紧急程度。如果推送服务通过仅传递高优先级消息来保护用户电池寿命,这将非常有用。
为推送消息指定一个“主题”名称,该名称将替换任何待处理的具有此主题名称的消息。
步骤 3:用户设备上的 Push event
发送推送消息后,推送服务会将您的消息保留在其服务器上,直到发生以下事件之一
- 设备上线,推送服务传递消息。
- 消息过期。如果发生这种情况,推送服务会将消息从其队列中删除,并且永远不会传递。
当推送服务传递消息时,浏览器将接收消息,解密任何数据,并在您的 Service Worker 中调度 push
事件。
Service Worker 是一个“特殊”的 JavaScript 文件。浏览器可以在您的页面未打开的情况下执行此 JavaScript。即使浏览器关闭,它也可以执行此 JavaScript。Service Worker 还具有 API(如 push),这些 API 在网页中不可用(即,在 Service Worker 脚本之外不可用的 API)。
在 Service Worker 的“push”事件内部,您可以执行任何后台任务。您可以进行分析调用、缓存离线页面和显示通知。
这就是推送消息传递的整个流程。
下一步
- Web Push Notification 概览
- 推送工作原理
- 订阅用户
- 权限用户体验
- 使用 Web Push 库发送消息
- Web Push Protocol
- 处理 Push Event
- 显示通知
- 通知行为
- 常用通知模式
- 推送通知常见问题解答
- 常见问题和错误报告