UnifiedPush: ein dezentrales, quelloffenes Push-Benachrichtigungsprotokoll

Ein modernes Android-Smartphone verlässt sich auf eine Vielzahl von Diensten, von App-Stores und Kalendern bis hin zu Messaging und Push-Benachrichtigungen. Für die meisten von ihnen gibt es offene Alternativen, aber bis jetzt war die einzige Option für Push-Benachrichtigungen der Google-eigene Dienst Firebase Cloud Messaging (FCM). UnifiedPush ist eine neue Alternative, mit der Sie Push-Benachrichtigungen erhalten können, ohne an ein einziges Unternehmen gebunden zu sein.

Push-Benachrichtigungen sind für das moderne mobile Erlebnis unerlässlich, da sie es Anwendungen ermöglichen, mit den Nutzern in Echtzeit zu kommunizieren, auch wenn sie nicht aktiv genutzt werden. Der Rückgriff auf von Google bereitgestellte Push-Benachrichtigungen stellt ein Problem für den Datenschutz und die Unabhängigkeit dar. Die proprietäre FCM-Bibliothek kann nicht in F-Droid-Apps integriert werden und ist auf die Google-Dienste angewiesen. Infolgedessen ist es üblich, dass FOSS-Anwendungen eine dauerhafte Direktverbindung zwischen der Anwendung und dem Server als Alternative verwenden.

Die Einschränkungen direkter App-Server-Verbindungen

Zwar ist es technisch möglich, dass jede Anwendung eine Verbindung zu ihrem eigenen Server herstellt und die Benachrichtigungen direkt empfängt, doch gibt es mehrere Gründe, warum dieser Ansatz nicht praktikabel oder effektiv ist.

Der Aufbau und die Aufrechterhaltung einer direkten Verbindung zwischen einer App und einem Server kann ressourcenintensiv sein, was den Akku, die CPU und die Netzwerkressourcen des Geräts belasten kann.

  • Um die Ressourcenbelastung zu minimieren, versucht das Betriebssystem (OS), Anwendungen, die nicht aktiv genutzt werden, auszusetzen. Wenn jedoch jede Anwendung aktiv eine Serververbindung aufrechterhält, kann das Betriebssystem sie nicht aussetzen.
  • Mehrere Apps, die ihre eigenen Server in variablen Intervallen anpingen, können verhindern, dass das Gerät in einen stromsparenden Ruhemodus wechselt, was den Akku des Geräts schneller entladen kann.
  • Indem man einer speziellen App die Möglichkeit gibt, vorrangige Verbindungen herzustellen, werden diese Probleme minimiert und das Betriebssystem kann andere Anwendungen effizient aussetzen und in den Ruhezustand versetzen, was Ressourcen spart und den Akkuverbrauch reduziert.
  • Als Entwickler kann die Verwaltung von Hintergrunddiensten und die Optimierung von Verbindungen komplex und zeitaufwändig sein. Durch die Verwendung eines Push-Benachrichtigungsdienstes können Sie diese Verantwortung an eine spezielle App auslagern, sodass Sie sich auf andere Aspekte Ihrer App konzentrieren können.

Wie beginne ich als Benutzer mit UnifiedPush?

Anwendungen, die UnifiedPush unterstützen, können Benachrichtigungen über eine spezielle UnifiedPush-Anwendung empfangen, die eine einzige Serververbindung unterhält, um alle Benachrichtigungen zu empfangen. Wir nennen diese “UnifiedPush-Anwendung” einen Distributor; sie verteilt Push-Benachrichtigungen an andere Anwendungen auf dem Gerät. Sie können wählen, welchen Distributor Sie verwenden möchten, den Serverteil selbst hosten oder sogar Ihren eigenen erstellen. Weitere Informationen zu Distributoren finden Sie in der vollständigen Liste.

Um UnifiedPush in einer Anwendung zu verwenden, die es unterstützt, müssen Sie Ihren Distributor installieren und konfigurieren. Sie können UP-Beispiel als einfache Test-App verwenden.

Ein animiertes SVG, das zeigt, wie alle Distributoren und Apps austauschbar sind und trotzdem über das UnifiedPush-Protokoll weiter zusammenarbeiten
Alle Distributoren sind mit allen Apps kompatibel

TL;DR auf Android

Die einfachste Art der Einrichtung von UnifiedPush bei einer Anwendung, die es unterstützt:

  1. Installieren Sie die Android-App ntfy; dies ist Ihr Distributor
  2. Öffnen Sie sie und dektivieren Sie die Akku-Optimierung für sie
  3. Schalten Sie in der Anwendung UnifiedPush ein; es wird „ntfy“ automatisch erkennen. (Dieser Schritt hängt von der Nutzerfreundlichkeit der App ab)

Ein Screenshot des Bildschirms zur Auswahl des Distributors mit Gotify-UP, Google Services, ntfy, UP-FCM Distributor, NextPush, NoProvider2Push
Stehen mehrere Distributoren zur Verfügung (ja, ich weiß, ich habe zu viele :P), können Sie unter ihnen auswählen. Gibt es nur einen, wird er automatisch ausgewählt.

Wie kann ich, als Entwickler, die UnifiedPush-Unterstützung in meiner App ergänzen?

Um die UnifiedPush-Unterstützung zu Ihrer Anwendung hinzuzufügen, müssen Sie zunächst sicherstellen, dass Ihr Server UnifiedPush-kompatibel ist: er muss in der Lage sein, Benachrichtigungen an verschiedene Endpunkte zu senden, die URLs sind, die auf diverse von Nutzern verwendete Server verweisen. Wenn Ihre Anwendung ein Gateway nutzt, um mit Googles Push Notifications zu arbeiten, kann eine Modifizierung des Gateways ihn UnifiedPush-kompatibel machen.

Auf Seiten der mobilen App müssen Sie, sobald der Nutzer UnifiedPush aktiviert, auf dem Gerät des Anwenders nach installierten Distributoren suchen. Die App sollte dann den Anwender auffordern, den Distributor auszuwählen, den er nutzen möchte. Danach können Sie ihn registrieren.

Der ausgewählte Distributor wird dann einen neuen Endpunkt senden, den die Anwendung an ihren Server weiterleiten sollte. Durch Registrierung eines Android BroadcastReceiver bereitet sich die App danach vor, an diesen Endpunkt gesendete Daten zu empfangen. Dieser BroadcastReceiver verarbeitet die von Ihrem Server kommenden Nachrichten (oftmals ein Ping, um die Benachrichtigungen abzuholen).

Es ist wichtig, die Anwendung mit dem ausgewählten Distributor bei jedem App-Start neu anzumelden, für den Fall, dass die Synchronisierung ausfällt. Wenn die App wieder denselben Endpunkt empfängt, ist keine erneute Registrierung nötig.

Das meiste hiervon wird durch die UnifiedPush-Bibliothek erledigt. Eine detailiertere Anleitung finden Sie auf unserer Dokumentationsseite.

Wenn Sie Hilfe bei der Einbindung von UnifiedPush in Ihre App brauchen, beantworten wir gerne all Ihre Fragen in unserem Matrix-Chat.

Hinweis: Dieser Beitrag fokussiert sich auf Android; Anleitungen zur Ergänzung einer UnifiedPush-Unterstützung in einer Linux-Anwendung finden Sie auf unserer Website.

Was passiert bei UnifiedPush im Hintergrund?

Im Grunde ist UnifiedPush eine Spezifikation. Diese Spezifikation teilt sich in zwei Hälften:

  • Auf der Geräte- (Client-)Seite, definiert es ein Application Programming Interface (API), um jeder Endnutzer-Anwendung (z. B. Ihrer Messaging-App) die Kommunikation mit jeder Distributor-Anwendung (ntfy, NextPush, etc.) zu ermöglichen
  • Auf der Server-Seite beschreibt das API, wie der App-Server (Matrix-Homeserver, Mastodon-Instanz, etc.) Nachrichten an den Push-Server (ntfy-Server, Nextcloud-Server, etc.) sendet.

Unsere Client-Bibliotheken und die Referenz-Proxys unterstützen sich gegenseitig bei der Einbindung beider Seiten der Spezifikation.

Um einen UnifiedPush-Endpunkt zu erhalten (die Fähigkeit eine URL abzurufen, an die Benachrichtigungen gehen sollen), meldet sich die Nutzeranwendung beim UnifiedPush-Distributor an, der eine dauerhafte Verbindung mit dem Push-Server unterhält. Mit der Anmeldung liefert der Distributor der Anwendung eine eindeutige URL, die auf den Push-Server verweist. Diese Endpunkt-URL wird dann durch den App-Client an den App-Server übertragen.

Wenn der App-Server eine Push-Nachricht an die Nutzer-App senden muss, schickt er die Nachricht in Form einer einfachen HTTP POST-Anfrage an den Push-Server. Der Push-Server leitet dann die Push-Nachricht an den Distributor weiter, der sie in der Nutzer-App zustellt.

Ein Hauptmerkmal von UnifiedPush ist, dass die Kommunikationsart zwischen dem Push-Server und dem Distributor nicht vorgegeben ist. Das bedeutet, dass eine Vielzahl von Techniken dafür zur Anwendung kommen können, wie beispielsweise WebSockets, Server-Sent Events, XMPP, rohes TCP oder sogar SMS, was immer für den Anwender am besten funktioniert.

Ein animiertes SVG zur Illustration wie eine Nachricht alle Schritte von
UnifiedPush durchläuft vom App-Server über den Push-Server zur
Distributor-App (auf dem Gerät) und der Nutzeranwendung, die dann aufgeweckt
wird und eine Android-Benachrichtigung ausgibt

Der Distributor verwendet plattformspezifische IPC-Mechanismen, wie Broadcast Intents in Android oder D-Bus in Linux, um die App aufzuwecken und ihr die Bearbeitung der Push-Nachricht zu ermöglichen. Die App kann dann die Daten weiter verabeiten und entscheiden, ob aufgrund der Inhalte eine Benachrichtigung angezeigt werden soll. Es ist wichtig festzustellen, dass sich UnifiedPush nicht um die Anzeige der für den Anwender sichtbaren Benachrichtigungen kümmert; es liefert der App lediglich Daten. Demzufolge können Apps auf verschiedenen Plattformen Benachrichtigungseigenschaften unterstützen, ohne Beteiligung von UnifiedPush oder einem Server.

In Fällen, in denen der App-Server UnifiedPush nicht von Haus aus unterstützt, kann ein Push Gateway anwendungsspezifische Benachrichtigungen in das UnifiedPush-Server-Protokoll umwandeln. Einige bekannte Push Gateways, wie das für Matrix, sind direkt in Push-Servern zum einfachen Selbst-hosten integriert. Außerdem werden in seltenen Fällen Rewrite Proxies verwendet, wenn der Push-Server UnifiedPush nicht unterstützt, wie der FCM-Distributor, der UnifiedPush-over-FCM sendet.

Eine Abbildung, die alle oben beschriebenen Komponenten und deren
Verknüpfungen miteinander darstellt Push Provider = Push Server

Kompatibilität zwischen UnifiedPush und WebPush

Möglicherweise blicken Sie nun auf den Elefanten im Raum: WebPush (RFC8030). WebPush ist der offene Standard, den Browser für ihre Push-Benachrichtigungen verwenden. Und die gute Nachricht ist, dass UnifiedPush mit WebPush kompatibel ist … meistens.

Grundsätzlich sollten App-Server, die WebPush unterstützen aber nicht seine erweiterten Funktionen brauchen und Push nicht ausschließlich auf populäre WebPush-Server beschränken (jene der Browser-Anbieter), ohne Problem mit UnifiedPush-Lieferanten zusammenarbeiten. Wir arbeiten an Lösungen, um eine bessere und stabilere WebPush-Unterstützung zu gewährleisten.

Zukunftspläne

  • Je mehr Apps UnifiedPush übernehmen, desto nützlicher wird es werden. Momentan wird UnifiedPush von vielen Matrix- und Mastodon-Apps unterstützt. Wir arbeiten daran, Open-Source-Versionen beliebter Apps wie Telegram und Signal dazu zu kriegen, UnifiedPush zu unterstützen.
  • Die Verbesserung der WebPush-Unterstützung wird auch dazu beitragen, dass die Zahl der Apps, die UnifiedPush nutzen können, wachsen wird. Wir arbeiten an einer besseren WebPush-Kompatibilität mit UnifiedPush.
  • Wie steht es um Distributoren, die in Custom-ROMs für Android, wie Lineage OS oder /e/OS (murena), eingebaut sind? Deren Support könnte die UnifiedPush-Unterstützung in der Google-losen Community immens verstärken.
  • Linux-Plattformen können ebenfalls von UnifiedPush profitieren. Die Verbesserung der Linux-Spezifikation und Erhöhung seiner Akzeptanz wird dabei helfen, die Akkulaufzeit und Reaktivität zu verbessern.
  • Da UnifiedPush sehr flexibel ist, könnten einige Plattformen auch größere Effizienzgewinne erzielen, indem Energiespar-Hardware für den Distributor genutzt wird: indem er auf dem Modem oder einem Energiespar-Core bleibt, während sich das Gerät im Ruhemodus befindet.

Was bleibt am Ende des Tages, wenn Sie eine Matrix- oder Mastodon-App oder eine der anderen unterstützten Apps auf Android verwenden, besteht die große Chance, dass Sie UnifiedPush nutzen können, um Ihre Push-Benachrichtigungen zu erhalten, ohne sich auf Google verlassen zu müssen. Sie können heute damit beginnen, UnifiedPush zu nutzen, indem Sie ntfy installieren oder einen anderen Distributor auswählen.

Wenn Sie ein App-Entwickler sind, der daran interessiert ist, dass Ihre App, wenn sie über F-Droid installiert wird, Push-Benachrichtigungen empfängt und Ihren Anwendern ermöglichen wollen, eine unabhängige, selbst-gehostete Infrastruktur zu besitzen, testen Sie UnifiedPush und sprechen Sie mit uns, falls Sie Fragen haben!