24.09.2013

GCM zu Mehrdevice

Google stellt auf der I/O ein Feature für Android vor, welches viele User mit mehr als einem Gerät wirklich erfreut hat. Sie haben es so vorgestellt, dass ein User - auf mehreren Geräten - eine Benachrichtigung bekommt. Als er dann auf seinem Nexus 10 diese weg gewischt hat, verschwand sie wie von Zauberhand auch auf dem anderen Gerät. Wie ist es bisher? Man bekommt eine Notification. Alle Geräte bekommen es und man muss sie überall "bestätigen", dass sie gelesen wurde. Außer bei G+ und Gmail. Dort ist dieses Feature nämlich schon eingebaut.

Doch warum besitzen die anderen Apps nicht auch diese Funktion? Dazu schauen wir uns erst mal den technischen Hintergrund an:
Push-Benachrichtigungen kommen, wenn man es "Google-Like" implementiert, über Google Cloud Messaging (GCM). Das Verfahren ist relativ einfach erklärt. Aus Entwickler-Sicht braucht man nur einen "kleinen" Server oder Datenbank, der eine eindeutige ID des Benutzers speichert. Dieser Server muss, wenn er nun etwas an das Gerät senden will, via HTTP-Post oder als JSON-String an den GCM-Server von Google senden. Dank der großen Verzahnung von Google und Android kann der Server relativ Ressourcen schonend eine Nachricht ans Handy schicken und die - wenn erwünscht - Benachrichtigung anzeigen.
Das Problem an der ganzen ist, dass das Handy nicht antworten kann. Wenn der GCM-Server einen Fehler erkennt, dann ist es kein Problem "unserem Server" zu sagen, dass etwas schief gelaufen ist. Wenn der Server aber alles korrekt abschickt und das Device, aus welchen Gründen auch immer, nicht mehr anwesend ist oder einfach ein "ok, habe empfangen" senden will, hat es Pech.

Genau hier setzte Google an und stellt das Protokoll auf XMPP um. Dieses Protokoll sagt vielleicht einigen was. "Erfunden" wurde es ursprünglich um Chat-Nachrichten auszutauschen. Nach dem Senden wird also, in unserem Fall, die Verbindung aufrecht erhalten und das Handy kann noch antworten. Ob ein Simples "Ja, Nachricht empfangen" oder vielleicht einfach dem GCM-Server zu sagen "Nachricht von xxx@gmail.com gelesen. Auf allen anderen Geräten diese Benachrichtigung löschen".

So kommen wir nun wieder auf den Ursprung. Mit zweiterem Verfahren kann man das ganze nämlich ziemlich einfach implemtieren. Aber, und es gibt immer ein großes aber, diese Methode ist schlicht weg nicht verfügbar! Google hat das ganze zwar veröffentlicht und vielen eine Freude gemacht, doch wer es nutzten möchte, der darf sich erst mal bei Google Anmelden. Das da 0-8-15 Developer nicht durch kommen, dürfte klar sein.

Schade, aber typisch Google. Etwas vorstellen und dann nicht veröffentlich. Klar, wenn etwas noch nicht ausgereift oder verbuggt ist, dann bloß nicht für die breite Masse zur Verfügung stellen. Aber wieso dann die große Ankündigung? Groß locken und nichts dahinter. Schade Google. Wieder mal ein Schuss ins eigene Knie...