wake-up-neo.com

Chat-App für Android mit einem XMPP-Server und Google Cloud Messaging (oder dem neueren Firebase Cloud Messaging) für Push-Benachrichtigungen

Ich entwickle eine Chat-App für Android. Ich habe seit Wochen über XMPP und Google Cloud Messaging (und Firebase Cloud Messaging) gelesen und bin immer noch sehr verwirrt.

Derzeit habe ich bereits einen XMPP-Server (Ejabberd) lokal eingerichtet und meine Android-App mithilfe der Smack-Bibliothek erfolgreich mit diesem verbunden.

Nach meinem Verständnis muss ich GCM oder den neueren FCM für Push-Benachrichtigungen verwenden. Daher habe ich bereits ein Projekt in Google Cloud Platform erstellt. Meine Android App kann auch über die Smack-Bibliothek eine Verbindung dazu herstellen (anstatt direkt mit meinem XMPP-Server zu verbinden). Auf meinem Server habe ich eine kleine Java-App, die auch über die Smack-Bibliothek eine Verbindung zu GCM herstellt.

Bis hier ist alles in Ordnung. Meine große Verwirrung ist: Wie kann ich meinen XMPP-Server mit GCM für Push-Benachrichtigungen verwenden? In jeder Dokumentation, Beispielen, Anleitungen und Tutorials, die ich für serverseitige Implementierungen gefunden habe, erkläre ich nur, wie ich eine Verbindung zum GCM herstelle, aber keiner sagt mir, wie ich meinen XMPP-Server in Verbindung mit GCM verwende. Was fehlt mir? Meine Java-App stellt lediglich eine Verbindung zu GCM her, empfängt und sendet Nachrichten von und zu GCM, aber mein XMPP-Server sitzt nur da und tut nichts. Tatsächlich verwenden meine Android-App und meine Java-App für Server ausschließlich GCM, nicht meinen XMPP-Server.

Ich hoffe, dass mir jemand helfen kann, dies als Ganzes zu verstehen. Ich vermisse offensichtlich einige Schlüsselelemente, um diese Implementierung zu erreichen.

13

Sie müssen Ejabberd und FCM miteinander mischen, so machen es alle großen Chat-Apps. Für die Grundlagen gibt es drei Komponenten: App Server, der über XMPP mit FCM, Ejabberd und Ihrer Client-App verbunden ist.

  1. Wenn sich die App im Vordergrund befindet, können Sie mit der Smack-Bibliothek eine direkte Verbindung zu Ihrem Ejabberd-Server herstellen, Nachrichten senden, die Anwesenheit des Benutzers ändern usw. Die Verbindung zu Ihrem Ejabberd ist wird während dieser Zeit beibehalten. Sie nicht senden in dieser Zeit Upstream-Nachrichten!
  2. Sobald der Benutzer von Ihrer App weg navigiert, können Sie die Verbindung schließen. Der Benutzer wird jetzt als "Abwesend" oder "Offline" betrachtet.
  3. Ab diesem Zeitpunkt kommuniziert Ihr App Server mit dem FCM, um nachgelagerte Nachrichten auch über die Smack-Bibliothek an das Gerät zu senden.
  4. Auf dem Clientgerät: Sie bearbeiten die eingehende Nachricht und zeigen eine Benachrichtigung an. Mit Android N können Benutzer direkt von der Benachrichtigung aus antworten. Ich gehe davon aus, dass Sie in diesem Fall FCM verwenden würden, um eine Upstream-Nachricht an Ihren App-Server zu senden, da während dieser Zeit keine aktive Verbindung besteht zu Ihrem Ejabberd-Server.
  5. Sobald der Benutzer auf die Benachrichtigung tippt, kehrt die App in den Vordergrund zurück und Sie stellen Sie erneut eine Verbindung zu Ejabberd her und kehren zu Schritt 1 zurück.

Dies ist die grundlegende Beschreibung der Architektur, die Sie benötigen, um das zu erreichen, was Sie möchten.

14
Nimrod Dayan

Sie sollten einen Java-Server einrichten, der eine Verbindung zu FCM (früher GCM) herstellt. Sie können dann von Ihrem Gerät aus eine Upstream-Nachricht an FCM senden, der diese Upstream-Nachricht an Ihren Java-Server sendet. Innerhalb dieses Java-Servers können Sie mit dieser Upstream-Nachricht eine Downstream-Nachricht an die Zielgeräte senden. Auf der Geräteseite können Sie dann die empfangenen Downstream-Nachrichten bearbeiten, um eine Push-Benachrichtigung zu erhalten.

Einige nützliche Links:

So senden Sie eine Upstream-Nachricht:
https://firebase.google.com/docs/cloud-messaging/upstream#sample-send

So empfangen und verarbeiten Sie Downstream-Nachrichten:
https://firebase.google.com/docs/cloud-messaging/downstream#sample-receive

So richten Sie einen Java-Beispielserver ein:
https://stackoverflow.com/a/38170310/4433653

4
Riley MacDonald

Dies ist ein Java-Beispielprojekt, um den XMPP Connection Server von Firebase Cloud Messaging (FCM) zu präsentieren. Dieses Projekt ist ein sehr einfacher Standalone-Server, den ich als Basis für ein größeres Projekt entwickelt habe. Es ist ein Anwendungsserver, den wir in unserer Umgebung implementieren müssen. Dieser Server sendet Daten über den FCM CCS-Server über das XMPP-Protokoll an eine Client-App.

https://github.com/carlosCharz/fcmxmppserver

Und ich habe auch ein Video in Youtube erstellt, in dem ich erkläre, was es macht.

https://www.youtube.com/watch?v=PA91bVq5sHw

Ich hoffe, Sie finden es nützlich.

Ich baue auch eine Chat-Anwendung in Android mit Smack v.4.1.8, der neuesten Version von Smack, und unser Server verwendet Ejabberd. Ich verwende keine Drittanbieter wie GCM oder Firebase, um die Downstream-Nachricht von Benutzer zu Benutzer zu verschieben. Wenn ich mich nicht irre, werden Sie GCM oder Firebase verwenden, um die Nachricht von Benutzer zu Benutzer zu verschieben, wenn ja, tun Sie dies einfach nicht. 

Warum? Das TCP-Protokoll überwacht ständig einen Aufruflistener, den Sie beim Herstellen der Verbindung in App registriert haben und weiterhin verbunden sind. Smack hat einen Listener mit dem Namen "addAsyncStanzaListener ()"

mit addAsyncStanzaListener können Sie ein Empfangspaket in App abhören. Sie haben

 public void processPacket(Stanza packet) 

Sie können das aufrufen und Sie werden das Paket im Laufe der Zeit abhören. 

Ich recherchiere über die Aufrechterhaltung einer stabilen Verbindung von Smack. Die meisten Android-Smartphones verfügen über jede Konfiguration und Einschränkung. Wir können nicht alle Geräte testen ... Hier meine Tipps, um die Verbindung stabil zu halten:

  1. Verwenden Sie ForegroundService statt BackgroundService. Ich schlage diesen Ansatz vor, da die meisten Android-Geräte auf eine App beschränkt sind, die im Hintergrund ausgeführt wird. Sie werden die App beenden, wenn die App vom Task-Manager durchgestrichen wird. (z. B. verfügen Asus zenphone über ein Power-Management)
  2. ForegroundService verhindert, dass sich die App im Leerlauf befindet.
  3. Registrieren Sie ReconnectingManager
  4. Pingfailed registrieren
  5. Registrieren Sie den ServerPingWithAlarmManager

Und das ist es. Alle Anfragen, einfach Kommentar unten :)

Bester Respekt R Aditya Gumay 

1
raditya gumay

Ihr Vorschlag ist gültig für eine Verbindung mit TCP/IP, die niemals abbricht. Dies ist im Mobilfunknetz 3G/4G nicht der Fall. In einem echten 3G/4G-Netzwerk befindet sich der mobile Client/APP möglicherweise im Zombie-Status (nicht verbunden) . Deshalb benötigen Sie Firebase/FCM, um zu spielen.

0
TC Juan