现代 Android 智能手机依赖于大量服务,从应用商店和日历到消息传递和推送通知。他们中的大多数都有开放的替代方案,但直到现在,推送通知的唯一选择是 Google 的专有服务,Firebase Cloud Messaging (FCM)。 UnifiedPush 是一种新的替代方案,它允许您在不依赖于单个公司的情况下获得推送通知

推送通知对于现代移动体验至关重要,因为它们允许应用与用户实时通信,即使未在主动使用时。依赖 Google 提供的推送通知导致了对隐私和独立性的担忧。专有的 FCM 库不能包含在 F-Droid 应用中,并且依赖于 Google 服务。因此,通常会看到 FOSS 应用采用应用和服务器之间的持久直接连接作为替代方案。

应用-服务器直接连接的局限性

虽然从技术上讲每个应用都可以连接到自己的服务器并直接接收通知,但有多种原因导致这种方法可能并不实用或有效。

在应用和服务器之间建立和维护直接连接可能会占用大量资源,影响设备的电池、CPU 和网络资源。

  • 为了最大限度地减少资源负载,操作系统 (OS) 会尝试挂起未被主动使用的应用。但是,如果每个应用都主动维护服务器连接,则操作系统无法暂停它们。
  • 多个应用以可变的时间间隔 ping 自己的服务器会阻止设备进入低功耗睡眠模式,这会更快地耗尽设备的电池。
  • 让一个特殊的应用能够建立优先连接可以最大限度地减少这些问题,并允许操作系统有效地挂起其他应用并进入睡眠状态,从而节省资源并减少电池消耗。
  • 作为开发者,管理后台服务和优化连接可能既复杂又耗时。通过使用推送通知服务,您可以将此责任转移到专门的应用,让您专注于应用的其他方面。

作为用户,我要如何开始使用 UnifiedPush?

支持 UnifiedPush 的应用可以通过专用的 UnifiedPush 应用接收通知,该应用维护单个服务器连接以接收所有通知。我们将此“UnifiedPush 应用”称为 分发器;它将推送通知分发到设备上的其他应用。您可以选择要使用的分发器,自行托管服务器部分,甚至创建自己的分发器。有关分发器的更多信息,请查看完整列表

要在支持它的应用上使用 UnifiedPush,您必须安装和配置您的分发器。您可以使用 UP-Example 作为简单的测试应用。

一张 SVG 动图,展示了任意分发器和应用是如何通过 UnifiedPush 协议,可互相替换并仍能协同工作
所有分发器与应用都兼容

TL;DR 关于 Android

设置 UnifiedPush 并使用支持它的应用的最简单方法是:

  1. 安装 ntfy Android 应用;这是你的分发器
  2. 打开它,并为其禁用电池优化
  3. 在应用中开启UnifiedPush;它会自动检测 ntfy。 (此步骤取决于应用程序的用户体验)

分发器选择屏幕截图,显示 Gotify-UP、Google Services、ntfy、UP-FCM 分发器、NextPush、NoProvider2Push
当有多个分发器可用时(是的,我知道我有太多分发器了 :P),您可以在它们之间进行选择。只有一个时,它将自动被选择

作为开发者,如何向我的应用添加 UnifiedPush 支持?

要为您的应用添加 UnifiedPush 支持,您首先需要确保您的服务器与 UnifiedPush 兼容:它必须能够将通知发送到不同的端点,这些端点是指向用户使用的各种服务器的 URL。如果您的应用使用网关来处理 Google 推送通知,则修改网关可以使其与 UnifiedPush 兼容。

在移动应用端,一旦用户启用 UnifiedPush,您必须检查用户设备上是否安装了分发器。然后,该应用应提示用户选择他们想要使用的分发器。之后,您可以注册它。

选定的分发器将发送一个新的端点,应用应将其转发到其服务器。然后,应用准备通过注册 Android BroadcastReceiver 来接收发送到该端点的数据。此 BroadcastReceiver 处理来自您的服务器的消息(通常是 ping 以获取通知)。

每次应用启动时向选定的分发器注册应用很重要,以防它们不同步。如果应用再次收到相同的端点,则不需要重新注册端点。

其中大部分由 UnifiedPush 库处理。您可以在我们的文档网站上找到更详细的说明。

如果您在应用中实现 UnifiedPush 时需要帮助,我们很乐意回答您在我们的 Matrix 聊天室中提出的任何问题。

注意:这篇博文主要针对 Android;在我们的网站上可以找到在 Linux 应用上添加 UnifiedPush 支持的说明。

UnifiedPush 底层是如何工作的?

UnifiedPush 的核心是一个规范。该规范分为两半:

  • 在设备(客户)端,它定义了一个应用编程接口 (API) 以允许任何最终用户应用(例如您的消息应用)与任何分发器应用( ntfy、NextPush 等)
  • 在服务器端,API 描述了应用服务器(Matrix homeserver、Mastodon 实例等)如何向推送服务器(ntfy 服务器、Nextcloud 服务器等)发送消息.

我们的客户端库和参考代理分别协助实施规范的两端。

为获得 UnifiedPush 端点(向其发送通知的功能 URL),最终用户应用向 UnifiedPush 分发器注册,该分发器与推送服务器保持持续连接。注册后,分发者向应用提供指向推送服务器的唯一 URL。该端点 URL 然后由应用客户端传输到应用服务器。

当应用服务器需要向最终用户应用发送推送消息时,它会使用简单的 HTTP POST 请求将消息发送到推送服务器。推送服务器然后将推送消息转发给分发器,分发器将其传递给最终用户应用。

UnifiedPush 的一个关键特性是不指定推送服务器和分发器之间的通信。这意味着可以采用多种技术,例如 WebSocket、服务器发送事件、XMPP、原始 TCP 甚至 SMS,只要最适合用户即可。

一张 SVG 动图,展示了一条消息经过 UnifiedPush
的所有步骤,即从应用服务器发送到推送服务器,再到(手机上的)分发器应用和最终用户应用,然后唤醒并发出一条 Android 通知

分发器使用平台特定的 IPC 机制(例如 Android 上的 Broadcast Intents 或 Linux 上的 D-Bus)来唤醒应用并允许它处理推送消息。然后应用可以处理数据并根据内容决定是否显示通知。重要的是要注意 UnifiedPush 不处理用户可见通知的显示;它只向应用程序提供数据。因此,应用可以支持各种平台的通知功能,而无需 UnifiedPush 或服务器的参与。

在应用服务器本身不支持 UnifiedPush 的情况下,推送网关可以将特定于应用的通知转换为 UnifiedPush 服务器协议。一些流行的推送网关,例如用于 Matrix 的推送网关,被直接集成到推送服务器中以方便自托管。此外,Rewrite Proxies 用于推送服务器不支持 UnifiedPush 的极少数情况,例如 FCM 分发器发送 UnifiedPush-over-FCM。

显示上述所有组件相互链接的静态图像 Push Provider = Push Server

UnifiedPush 与 WebPush 的兼容性

现在,您可能正在关注房间里的大象:WebPush (RFC8030)。 WebPush 是浏览器用于推送通知的开放标准。好消息是 UnifiedPush 与 WebPush 兼容……很大程度上。

基本上,支持 WebPush 但不需要其高级功能不会将推送限制为仅流行的 WebPush 服务器(来自浏览器供应商的服务器)的应用程序服务器应该可以毫无问题地使用 UnifiedPush 提供程序。我们正在研究解决方案,以确保更好、更稳定的 WebPush 支持。

未来计划

  • 采用 UnifiedPush 的应用越多,它就越有用。目前,许多 Matrix 和 Mastodon 应用都支持 UnifiedPush。我们还致力于让 Telegram 和 Signal 等流行应用的开源版本支持 UnifiedPush。
  • 改进 WebPush 支持也将有助于增加可以使用 UnifiedPush 的应用数量。我们正在努力使 WebPush 与 UnifiedPush 更好地兼容。
  • Lineage OS 或 /e/OS (murena) 等自定义 Android ROM 中的内置分发器呢?他们的支持可以极大地加速 De-Googled 社区中的 UnifiedPush 支持。
  • Linux 平台也可以从 UnifiedPush 中受益。改进 Linux 规范并提高其采用率将有助于提高电池寿命和响应性。
  • 由于 UnifiedPush 非常灵活,一些平台可以通过为分发器使用低功耗硬件来实现更大的效率提升:在手机休眠时将其保持在调制解调器或低功耗核心上。

归根结底,如果您在 Android 上使用 Matrix 或 Mastodon 应用或其他支持的应用之一,您很有可能可以使用 UnifiedPush 无需依赖 Google 即可获取推送通知。您现在可以通过安装 ntfy 或选择其他分发器开始使用 UnifiedPush。

如果您是应用开发者,对您的应用在从 F-Droid 安装时接收推送通知感兴趣,并允许您的用户拥有独立、自托管的基础设施,请查看 UnifiedPush,如果您有任何问题随时与我们交谈

UnifiedPush:一种去中心化的开源推送通知协议
标签: