Unterstützt Android Push-Benachrichtigungen in Echtzeit?


343

Ich habe kürzlich erfahren, wie iPhone-Apps fast sofort Benachrichtigungen an Apps erhalten können. Benachrichtigungen an Apps .

Dies erfolgt in Form von Push-Benachrichtigungen, einem maßgeschneiderten Protokoll, das eine ständige Datenverbindung zum iPhone aufrechterhält und Binärpakete an die App sendet, die unglaublich schnell Warnungen zwischen 0,5 und 5 Sekunden von der Server-App an die Telefon-App senden Reaktionszeit. Dies wird als Daten - und nicht als SMS - in sehr sehr kleinen Paketen gesendet, die als Teil des Datenplans berechnet werden und nicht als eingehende Nachrichten.

Ich würde gerne wissen, ob es unter Android entweder eine ähnliche Funktion gibt oder ob es möglich ist, mithilfe von Android-APIs etwas Ähnliches zu implementieren. Zur Verdeutlichung definiere ich ähnlich wie:

  • Keine SMS-Nachricht, sondern eine datengesteuerte Lösung
  • So in Echtzeit wie möglich
  • Ist skalierbar, dh als Serverteil einer mobilen App könnte ich Tausende von App-Instanzen in Sekunden benachrichtigen

Ich schätze, dass die App einen Pull-basierten HTTP-Anforderungs- / Antwortstil haben könnte, aber im Idealfall möchte ich nicht so stark abfragen, nur um nach Benachrichtigungen zu suchen. Außerdem ist es so, als würde der Datenplan durch Tropfen abgelassen.


3
Die Benachrichtigung für Google Mail und Google Chat liegt normalerweise innerhalb dieses Schwellenwerts. Es sollte eine Möglichkeit geben, dies in Ihrer eigenen App zu replizieren.
Dana the Sane

Ja, es gibt eine Android-Bibliothek, die Push-Messaging sehr einfach macht ... fügen Sie einfach Jigys Droid Notifications- Bibliothek in Ihre App ein und von dort sind es nur noch etwa 10 Codezeilen ... hoffe, das hilft :)
Corey Harden

In Pushy ( pushy.me ) finden Sie ein Echtzeit-Push-Benachrichtigungs-Gateway, das MQTT unter der Haube verwendet, um die Zuverlässigkeit zu verbessern. Vollständige Offenlegung - Ich habe Pushy gegründet.
Elad Nava

Antworten:


215

Firebase Cloud Messaging FCM FAQ ist die neue Version von GCM. Es erbt die Kerninfrastruktur von GCM, um Nachrichten zuverlässig auf Android, iOS und Chrome zu übermitteln. Sie werden GCM jedoch weiterhin unterstützen, da viele Entwickler heute GCM-SDKs verwenden, um Benachrichtigungen zu verarbeiten, und das Upgrade der Client-App einige Zeit in Anspruch nimmt.

Ab dem 26. Juni 2012 ist Google Cloud Messaging die bevorzugte Methode zum Senden von Nachrichten an Anwendungen, die auf Geräten ausgeführt werden.

Früher (und jetzt veraltet) hieß der Dienst Cloud To Device Messaging .


14
Google bietet unter code.google.com/android/c2dm eine detaillierte Dokumentation zur Implementierung in Ihre Android-App in Java. Der Beispielcode für die Kommunikation mit dem serverseitigen Aspekt von C2DM fehlt jedoch. Ich habe hier ein Tutorial für diesen Aspekt geschrieben: blog.boxedice.com/2010/10/07/…
DavidM

2
Gibt es eine Möglichkeit, Benutzern mit Android 2.2 Push-Benachrichtigungen anzubieten, aber dieselbe App auf älteren Distributionen nur ohne Push-Benachrichtigungen ausführbar zu machen?
OneWorld

3
@OneWorld: Ja, genau wie bei jeder anderen Abwärtskompatibilitätstechnik für Android, verwenden Sie Reflection, um eine alternative Strategie auszuwählen, wenn C2DM nicht verfügbar ist. Weitere Informationen finden Sie unter: developer.android.com/resources/articles/…
Lie Ryan

1
developer.android.com/videos/index.html#v=PLM4LajwDVc Google I / O 2010 Präsentation über Push-Benachrichtigungen
vokilam

6
C2DM ist seit dem 26. Juni 2012 offiziell veraltet. Verwenden Sie stattdessen [Google Cloud Messaging für Android] ( developer.android.com/guide/google/gcm/index.html
Mithun Sreedharan,

47

XMPP ist eine gute Lösung. Ich habe es für eine Push-fähige Echtzeit-Android-Anwendung verwendet. XMPP ist leistungsstark, sehr erweiterbar und einfach zu integrieren und zu verwenden.

Es gibt viele kostenlose XMPP-Server (obwohl Sie sie aus Höflichkeit nicht missbrauchen sollten) und es gibt Open Source-Server, die Sie auf einer Ihrer eigenen Boxen ausführen können. OpenFire ist eine ausgezeichnete Wahl.

Die Bibliothek, die Sie wollen, ist nicht Smack, wie oben erwähnt, es ist aSmack . Beachten Sie jedoch, dass dies eine Build-Umgebung ist. Sie müssen die Bibliothek erstellen.

Dies ist eine Berechnung, die ich für die Auswirkungen einer XMPP-Lösung auf die Akkulaufzeit durchgeführt habe:

Der Android-Client muss eine dauerhafte TCP-Verbindung aufrechterhalten, indem er regelmäßig aufwacht, um einen Heartbeat an den XMPP-Server zu senden.
Dies verursacht eindeutig Kosten in Bezug auf den Stromverbrauch. Eine Schätzung dieser Kosten finden Sie unten:

  • Verwendung eines 1400-mAh-Akkus (wie im Nexus One und im HTC Desire enthalten)
  • Ein inaktives Gerät, das mit einem 3G-Netzwerk verbunden ist, verbraucht ungefähr 5 mA
  • Der Weck-, Herzschlag- und Schlafzyklus erfolgt alle 5 Minuten, dauert drei Sekunden und verbraucht 300 mA
  • Die Kosten für den Batterieverbrauch pro Stunde betragen daher:
    • 36 Sekunden 300mA = 3mAh Herzschlag senden
    • 3600 Sekunden 5mA = 5mAh im Leerlauf
    • 4:95 + 3 = 7: 95mAh kombiniert
  • Ein 1400-mAh-Akku hält im Leerlauf ungefähr 11,6 Tage und beim Ausführen der Anwendung 7,3 Tage, was einer Reduzierung der Akkulaufzeit um ca. 37% entspricht.
  • Eine Verkürzung der Batterielebensdauer um 37% stellt jedoch den absolut schlimmsten Fall in der Praxis dar, da Geräte selten vollständig im Leerlauf sind.

2
In der Praxis hält das Telefon jedoch 3 Stunden, wenn Apps dies tun, da Hunderte von Absichten ausgeführt werden, wenn das Telefon aufwacht oder die Anzeige eingeschaltet wird oder sich der Netzwerkstatus ändert.
Monstieur

33

Ich habe vor kurzem angefangen, mit MQTT http://mqtt.org für Android zu spielen, um das zu tun, wonach Sie fragen (dh nicht SMS, sondern datengesteuert, fast sofortige Nachrichtenübermittlung, skalierbar, nicht abrufbar usw.).

Ich habe einen Blog-Beitrag mit Hintergrundinformationen zu diesem Fall, falls dieser hilfreich ist: http://dalelane.co.uk/blog/?p=938

(Hinweis: MQTT ist eine IBM Technologie, und ich sollte darauf hinweisen, dass ich für IBM arbeite.)


Wie macht mqtt das? Es muss irgendwo eine Umfrage geben? Sogar Apple muss abstimmen, aber ich denke, dass sie jeweils nur eine Verbindung herstellen, wodurch die Batterie nicht so stark
Janusz

3
Dazu wird eine TCP / IP-Verbindung geöffnet und offen gelassen. Es wird nicht abgefragt, obwohl gelegentlich eine kleine Ping-Nachricht über die Verbindung gesendet werden muss, um die Verbindung aufrechtzuerhalten.
Dalelane

MQTT ist definitiv der richtige Weg, wenn Sie sich beim Senden Ihrer Push-Nachricht über Google unwohl fühlen. Außerdem haben wir mit unseren Kunden Geheimhaltungsvereinbarungen getroffen, die die Nutzung von Cloud-Diensten für den Datenaustausch verbieten.
VH-NZZ



8

Wenn Sie sich darauf verlassen können, dass die Google-Bibliotheken für Ihren Zielmarkt verfügbar sind, möchten Sie möglicherweise auf die GTalk- Funktionalität zurückgreifen (Registrieren einer Ressource unter dem vorhandenen Benutzernamen - Abfangen der Nachrichten, wenn diese mit einem BroadcastReceiver eingehen).

Wenn nicht, und ich gehe davon aus, dass Sie dies nicht können , bündeln Sie Ihre eigenen XMPP-Versionen . Dies ist ein Problem, kann jedoch erleichtert werden, wenn XMPP separat als eigenständige Bibliothek gebündelt wird.

Sie können auch PubSubHubub in Betracht ziehen , aber ich habe keine Ahnung, wie das Netzwerk verwendet wird. Ich glaube, es ist auf XMPP aufgebaut.


Ich denke, der Artikel besagt, dass die Piggy-Back-Funktionalität immer verfügbar sein wird, solange sich die gtalk-Bibliotheken auf dem Gerät befinden. Haben Sie einige Ressourcen mit Beispielen, wie Sie das tatsächlich tun können?
Janusz

GTalk wird seit 1.0 (iirc) aus dem SDK entfernt.
MrSnowflake

8

Ich habe dies untersucht und PubSubHubBub, empfohlen von Jamesh, ist keine Option. PubSubHubBub ist für die Server-zu-Server-Kommunikation vorgesehen

"Ich bin hinter einem NAT. Kann ich einen Hub abonnieren? Der Hub kann keine Verbindung zu mir herstellen."

/Anonym

Nein, PSHB ist ein Server-zu-Server-Protokoll. Wenn Sie hinter NAT stehen, sind Sie nicht wirklich ein Server. Wir haben zwar Ideen für optionale PSHB-Erweiterungen für Hanging-Gets ("Long Polling") und / oder Messagebox-Polling für solche Clients entwickelt, diese sind jedoch nicht in der Kernspezifikation enthalten. Die Kernspezifikation ist nur Server-zu-Server.

/ Brad Fitzpatrick, San Francisco, Kalifornien

Quelle: http://moderator.appspot.com/#15/e=43e1a&t=426ac&f=b0c2d (direkter Link nicht möglich)

Ich bin zu dem Schluss gekommen, dass die einfachste Methode die Verwendung von Comet HTTP Push ist. Dies ist sowohl eine einfache als auch gut verstandene Lösung, kann aber auch für Webanwendungen wiederverwendet werden.


8

Es gibt eine neue Open-Source-Initiative zur Entwicklung einer Java-Bibliothek für Push-Benachrichtigungen unter Android unter Verwendung des Meteor-Kometenservers als Backend. Sie können es im Deacon Project Blog nachlesen . Wir brauchen Entwickler, also bitte verbreiten Sie das Wort!


7

Google hat kürzlich (18. Mai 2016) angekündigt, dass Firebase jetzt eine einheitliche Plattform für mobile Entwickler ist, einschließlich Push-Benachrichtigungen in nahezu Echtzeit. Es ist auch plattformübergreifend:

Das Unternehmen bietet jetzt allen Firebase-Benutzern kostenlose und unbegrenzte Benachrichtigungen mit Unterstützung für iOS, Android und das Web.

Quelle


6

Ich kann nicht finden, wo ich es gelesen habe, aber ich glaube, dass Google Mail eine offene TCP-Verbindung verwendet, um den E-Mail-Push durchzuführen.


Unter joelapenna.com/blog/2009/07/android-foursquare-and-push gibt es einen Blog-Beitrag eines Entwicklers einer Android-App, der dies zu unterstützen scheint.
Dalelane

Diese scheinen mir, sie wählen auch. Das mobile Gerät stellt eine Verbindung zum Server her und benachrichtigt den Server, der auf Aktualisierungen wartet. Der eigentliche Push wird vom Server initiiert, was für mobile Geräte sehr schwierig ist, und beinhaltet meistens die Unterstützung von Netzwerkanbietern (SMS / WAP-Push) ...
MrSnowflake

1
"Mit C2DM können Entwickler von Drittanbietern denselben Dienst wie mit Google Apps nutzen." von Android Cloud zu Device Messaging
Colithium

6

Wie GTalkaus dem SDK hervorgeht, ist es möglicherweise eine gute Idee, ein Standard-Push-Messaging-System zu erstellen. Auf diese Weise muss nur ein Dienst ausgeführt werden, es muss nur eine zusätzliche TCP-Verbindung geöffnet sein. Anwendungen sollten mit diesem Dienst über kommunizieren Intentsund zunächst die Erlaubnis zum Senden und Empfangen von Benachrichtigungen vom Dienst anfordern. Der Dienst sollte dann den Benutzer benachrichtigen, wenn eine neue Anwendung Nachrichten senden und empfangen möchte. Der Benutzer erteilt oder verweigert dann die Berechtigung, sodass er die Kontrolle behält. Die Anwendung registriert dann eine Aktion + Kategorie für den Dienst, sodass der Dienst weiß, wie die Push-Nachricht zugestellt wird.

Wäre das eine gute Idee oder nicht?


6

Warum entscheiden Sie sich nicht für die XMPP-Implementierung? Derzeit sind so viele öffentliche Server verfügbar, einschließlich gtalk, jabber, citadel usw. Für Android gibt es ein SDK mit dem Namen SMACK. Dies kann man nicht als Push-Benachrichtigung bezeichnen, aber mit XMPP können Sie eine Verbindung zwischen Client und Server offen halten, die eine bidirektionale Kommunikation ermöglicht. Bedeutet, dass sowohl Android-Client als auch -Server miteinander kommunizieren können. Derzeit wird dies die Notwendigkeit von Push in Android erfüllen. Ich habe einen Beispielcode implementiert und er funktioniert wirklich gut


Möchten Sie einen Link zu Ihrem Beispielcode bereitstellen? Haben Sie Tests bezüglich der Akkulaufzeit durchgeführt?
Alex

Ich habe die Akkulaufzeit getestet - der Herzschlag, den Sie alle sechs Minuten senden müssen, reduziert die Akkulaufzeit im schlimmsten Fall um 30% (dh das Gerät wacht nur auf, um einen Herzschlag zu senden). Im besten Fall (der Benutzer verwendet das Gerät zum Surfen, Telefonieren usw.) ist die Auswirkung auf die Akkulaufzeit vernachlässigbar.
Fleisch

6

Ich habe vor kurzem http://pushdroid.org entwickelt. Es ist eine einzelne Anwendung, die auf dem Telefon installiert werden sollte, genau wie Google sie in 2.2 implementiert hat. Dies funktioniert ab 1.5 und sendet absichtlich.


4

Das Problem mit GCM ist, dass der Prozess viele Konfigurationen umfasst:

  • Sie müssen Ihrer Android-App eine Menge Boilerplate hinzufügen
  • Sie müssen einen externen Server für die Kommunikation mit dem GCM-Server konfigurieren
  • Sie müssen Tests schreiben

Wenn Sie einfache Dinge mögen (wie ich), sollten Sie UrbanAirship ausprobieren . Dies ist (IMHO) der einfachste Weg, GCM in Ihrer App zu verwenden, ohne viel Konfiguration vorzunehmen. Außerdem erhalten Sie eine hübsche Benutzeroberfläche, mit der Sie testen können, ob Ihre GCM-Nachrichten korrekt zugestellt werden.

  • Die Anleitung zu den Dokumenten und den ersten Schritten finden Sie hier
  • Eine Beispielanwendung finden Sie hier

Hinweis: Ich bin in keiner Weise mit UrbanAirship verbunden



2

Sie haben ihre Listener, die von Ihnen verwendet werden müssen, indem sie ihre Bibliotheksklassen in Ihrem Code verwenden. Sie müssen sich nicht um das Schieben kümmern. Sie müssen die Nachricht an den Server senden. Der Server sendet die Nachricht an das Gerät. Sie benutzen OAuth. In Bezug auf Protokolle gibt es zwei Methoden, die CCS und XMPP verwenden. CCS verwendet XMPP nur als authentifizierte Transportschicht, sodass Sie die meisten XMPP-Bibliotheken zum Verwalten der Verbindung verwenden können. Um Benachrichtigungen an das Gerät zu senden, können Sie Code in die zu sendende Android-App sowie Ihren Servercode schreiben. Das Senden der Nachricht erfolgt nur über Ihren Code. Der Rest wird von Google Server im GCM-Fall erledigt. Sie können Details unter diesem Link überprüfen

http://developer.android.com/google/gcm/server.html

Auch für Sicherheitsprobleme

Google Cloud Messaging-Sicherheit https://groups.google.com/forum/#!topic/android-gcm/M-EevBitbhQ

Wenn Ihre App nicht ausgeführt wird, können auch Geräte Benachrichtigungen erhalten, da Sie Code für Broadcast-Listener schreiben müssen. Im Hintergrund hört es den Server ab und erhält jedes Mal, wenn ein Nachrichtenpaket vorhanden ist, die Nachricht als Benachrichtigung. Android hat einen Dienst, den Sie brauchen, um sich nicht darum zu kümmern. Sie müssen diese Ressourcen nur mithilfe der Bibliotheksklasse verwenden, die Ihnen die Arbeit erleichtert, und sie schreiben lassen, wenn Ihre App nicht ausgeführt wird. Außerdem wird eine Benachrichtigung empfangen. Offensichtlich würde es einen Hörer geben, der die App zum Empfangen bringt. Überprüfen Sie den Abschnitt "Nachricht empfangen" in diesem Link

http://developer.android.com/google/gcm/client.html

Es werden auch Anfragen von Benutzern akzeptiert. Für GCM reicht es aus. Bitte aktivieren Sie "Nachricht senden"

http://developer.android.com/google/gcm/client.html

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.