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.
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.
Dies ist die grundlegende Beschreibung der Architektur, die Sie benötigen, um das zu erreichen, was Sie möchten.
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
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:
Und das ist es. Alle Anfragen, einfach Kommentar unten :)
Bester Respekt R Aditya 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.