认识 Web 推送
即使网站用户当前未打开网站,网站也有很多理由通知用户时间敏感或高优先级事件。此功能称为 Web 推送,由 W3C 关于推送 API、通知 API 和Service Workers 的标准共同启用。WebKit 现在支持这些标准的相关部分以启用 Web 推送。
Apple 已对 macOS 进行了更改,这些更改与 WebKit 的支持深度集成,以提供出色的用户体验,我们很高兴地宣布 macOS Ventura 上的 Safari 16 支持 Web 推送。
请留意 2023 年 iOS 和 iPadOS 上的 Web 推送。
只要您按照标准编写了您的 Web 应用程序,您就能够触达 macOS Ventura 上的 Safari 16 用户。您无需加入 Apple Developer Program 即可发送 Web 推送通知。
如果您通过浏览器检测排除了 Safari,那么现在是切换到功能检测的好时机,它让您可以在新功能一经支持就立即利用它们。此外,如果您严格管理服务器上的推送端点,请务必允许来自 push.apple.com 任何子域的 URL。
所有这些及更多内容都在 WWDC22 的认识 Web 推送(15 分钟视频)中有所涵盖。
标准概述
Web 平台的大多数功能都在单个 Web 标准中描述。Web 推送是一个例外,有多个标准描述了实现要求。
Web 上有许多资源可以帮助 Web 应用程序作者开始使用这些标准。但为了进一步介绍 WebKit 的支持如何工作,在高层次上涵盖 Web 标准是很有用的。
推送 API 标准是开始时最直接相关的。它描述了允许网站注册推送订阅的 JavaScript 接口。该订阅允许使用推送服务向用户的浏览器发送推送消息。
ServiceWorker API 得到扩展以支持这些推送消息。一旦从域接收到推送消息,该域注册的服务工作脚本就会收到一个代表推送消息的事件。
通知 API 得到扩展,允许服务工作脚本即使没有打开的浏览器标签页也能发布通知。
当 Web 应用程序注册推送订阅时,它们承诺推送将始终对用户可见。当服务工作器处理推送消息时,它需要使用通知 API 来显示用户可见的通知。最后,当用户激活该通知时,服务工作器会收到一个代表通知激活的事件。
能力与隐私
WebKit 开源项目和 Apple 都将隐私视为一项基本人权。与 Web 平台的其他特权功能一样,请求推送订阅需要明确的用户手势。它还要求您将 userVisibleOnly
标志设置为 true,并通过始终在响应推送消息时显示通知来履行该承诺。
Web 推送 API 并非是静默后台运行的邀请,因为这既会侵犯用户的信任,又会影响用户的电池续航时间。
违反 userVisibleOnly
承诺将导致推送订阅被撤销。
关于 WebKit 的一些信息
你们中有些人对 WebKit 中 Web 推送的实现细节感兴趣。
WebKit 开源项目的一个目标是让交付一个与任何现代平台良好集成的现代浏览器引擎变得容易。
许多面向 Web 的功能完全在 WebKit 内部实现,给定 WebKit 端口的维护者无需进行任何额外工作即可在其平台上添加支持。
偶尔会有功能需要与平台相对深度地集成。这意味着 WebKit 端口需要在 WebKit 内部编写大量自定义代码或与平台特定库集成。例如,为了支持 HTML <audio>
和 <video>
元素,Apple 的端口利用 Apple 的 Core Media 框架,而 GTK 端口使用 GStreamer 项目。
一项功能可能还需要在每个应用程序基础上进行足够深度的自定义,以至于 WebKit 无法自行完成工作。
例如,Web 内容可能会调用 window.alert()
。在像 Safari 这样的通用 Web 浏览器中,浏览器希望控制警报本身的呈现。但是显示 Web 内容的电子书阅读器可能希望完全抑制警报。
从 WebKit 的角度来看,支持 Web 推送需要深入的逐平台和逐应用程序定制。
Apple 的 WebKit 端口中的 Web 推送
Apple 的 WebKit 端口包含一个名为 webpushd
的新守护进程。它作为 LaunchAgent 安装在 macOS Ventura 中以支持 Web 推送。此守护进程从 Safari 16 中的网页接收推送订阅请求,并将其转换为 Apple 推送通知服务的实际推送订阅。
传入系统的推送消息被传递到 webpushd
,然后它唤醒相应的应用程序以将任何待处理的推送消息传递给服务工作器。
Web 推送的承诺是,即使您的用户没有在浏览器标签页中打开您的网站,您也可以触达他们。由于我们将 webpushd
与 macOS Ventura 中内置的推送支持集成,即使 Safari 没有运行,推送消息也可以送达。
显示用户可见通知的要求是另一个特定于平台的点。不同的浏览器可能会以不同的方式实现通知 API 支持。Safari 始终通过依赖 macOS 通知中心来支持本地通知,并进行了额外更改以在 Safari 未运行时处理激活这些通知。
将 Apple 推送通知服务的新 Web 推送支持与 webpushd
集成,并在 Safari 未运行时支持通知,这些都是系统级更改,因此我们的实现要求 macOS Ventura 及更高版本。
更多资源
Apple 还有更多资源可以了解 macOS Ventura 上 Safari 16 中 Web 推送支持的更多信息
- 阅读在 Safari 和其他浏览器中发送 Web 推送通知
- 观看认识 Safari 的 Web 推送(15 分钟)
MDN 有一些关于 Web 推送的精彩资源。您应该从Web 推送 API 通知最佳实践开始。
当然,您也可以直接参考 W3C 标准