web-dev-qa-db-fra.com

Application de discussion pour Android utilisant un serveur XMPP et Google Cloud Messaging (ou la nouvelle version de Firebase Cloud Messaging) pour les notifications push

Je développe une application de chat pour Android. Je lis depuis des semaines sur XMPP et Google Cloud Messaging (et Firebase Cloud Messaging) et je suis encore très confus.

Actuellement, j'ai déjà configuré un serveur XMPP localement (Ejabberd) et connecté avec succès mon application Android à celui-ci à l'aide de la bibliothèque Smack.

À ma connaissance, je dois utiliser GCM ou le nouveau FCM pour les notifications Push. J'ai donc déjà créé un projet dans Google Cloud Platform. Mon application Android peut également s'y connecter à l'aide de la bibliothèque Smack (au lieu de se connecter directement à mon serveur XMPP). Sur mon serveur, j'ai une petite application Java qui se connecte à GCM à l'aide de la bibliothèque Smack.

Tout va bien jusqu'à ici. Ma grande confusion est la suivante: Comment utiliser mon serveur XMPP avec GCM for Push Notifications? Chaque documentation, exemples, guides, tutoriels que j'ai trouvés pour les implémentations côté serveur me disent simplement comment me connecter à GCM, mais aucun ne me dit comment utiliser mon serveur XMPP avec GCM. Qu'est-ce qui me manque? Mon application Java se connecte simplement à GCM, reçoit et envoie des messages de et vers GCM, mais mon serveur XMPP reste à ne rien faire. En réalité, mon application Android et mon application Java serveur utilisent exclusivement GCM, pas mon serveur XMPP.

J'espère que quelqu'un pourra m'aider à comprendre cela dans son ensemble, il me manque évidemment quelques éléments clés pour réaliser cette mise en œuvre.

13
Santiago Fermín

Vous devez combiner Ejabberd et FCM, c'est comme ça que toutes les grandes applications de chat le font. Pour les bases, il y a 3 composants: App Server connecté via XMPP à FCM, Ejabberd et votre application client.

  1. Lorsque l'application est au premier plan, vous utilisez la bibliothèque Smack pour vous connecter directement à votre serveur Ejabberd, envoyer des messages, modifier la présence de l'utilisateur, etc. La connexion à votre Ejabberd est conservée pendant ce temps. Vous ne envoyez pas de messages en amont pendant ce temps!
  2. Une fois que l'utilisateur quitte votre application, vous fermez la connexion. L'utilisateur est maintenant considéré comme "absent" ou "hors ligne".
  3. À partir de ce moment-là, votre serveur d'applications communique avec FCM pour envoyer également des messages en aval au périphérique à l'aide de la bibliothèque Smack. 
  4. Sur le périphérique client: vous gérez le message entrant et affichez une notification. Avec Android N, les utilisateurs peuvent répondre directement à partir de la notification. Je suppose que dans ce cas, vous utiliseriez FCM pour envoyer un message en amont à votre serveur d'applications, car pendant cette période, il n'y a pas de connexion active à votre serveur Ejabberd.
  5. Une fois que l'utilisateur a appuyé sur la notification, l'application revient au premier plan et vous reconnectez-vous à Ejabberd et revenez à l'étape 1.

C’est la description de base de l’architecture que vous devriez avoir pour réaliser ce que vous voulez.

10
Nimrod Dayan

Vous devez configurer un serveur Java qui se connecte à FCM (anciennement GCM). Vous pouvez ensuite, depuis votre périphérique, envoyer un message en amont à FCM, qui l'envoie ensuite à votre serveur Java. Ce dernier peut également gérer ce message en amont afin d'envoyer un message en aval aux périphériques ciblés. Ensuite, côté périphérique, vous pouvez gérer les messages en aval reçus pour donner une notification Push.

Quelques liens utiles:

Comment envoyer un message en amont:
https://firebase.google.com/docs/cloud-messaging/upstream#sample-send

Comment recevoir et gérer les messages en aval:
https://firebase.google.com/docs/cloud-messaging/downstream#sample-receive

Comment ai-je configuré un exemple de serveur Java:
https://stackoverflow.com/a/38170310/4433653

4
Riley MacDonald

Ceci est un exemple de projet Java destiné à présenter le serveur de connexion XMPP Firebase Cloud Messaging (FCM). Ce projet est un serveur autonome très simple que j'ai développé comme base d'un projet plus vaste. C'est un serveur d'applications que nous devons implémenter dans notre environnement. Ce serveur envoie des données à une application cliente via le serveur FCM CCS à l’aide du protocole XMPP.

https://github.com/carlosCharz/fcmxmppserver

Et aussi j'ai créé une vidéo sur youtube où j'explique ce qu'elle fait.

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

J'espère que vous le trouverez utile.

4

Je crée également une application de discussion sur Android avec Smack v.4.1.8, la dernière version de Smack, et notre serveur utilise ejabberd. Je n'utilise aucun tiers comme GCM ou Firebase pour envoyer un message en aval d'un utilisateur à un autre. Si je ne me trompe pas, vous allez utiliser GCM ou Firebase pour envoyer un message à un autre utilisateur, si oui, ne le faites pas. 

Pourquoi? Le protocole TCP continue d'écouter un écouteur d'invocation que vous avez enregistré dans App lorsque la connexion est établie et toujours connectée. Smack a un auditeur qui s'appelle "addAsyncStanzaListener ()"

addAsyncStanzaListener est utilisé pour écouter un paquet de réception dans App. Ils ont

 public void processPacket(Stanza packet) 

Vous pouvez l'invoquer et vous écouterez le paquet au fil du temps. 

Je fais une recherche sur le maintien d'une connexion stable de Smack. La plupart des smartphones Android ont chaque configuration, et restriction. Nous ne pouvons pas tester tous les périphériques . Voici mes conseils pour maintenir la connexion stable:

  1. Utilisez ForegroundService à la place de BackgroundService, je propose cette approche car la plupart des appareils Android ont des restrictions pour une application fonctionnant en arrière-plan. Ils tueront l'application lorsque celle-ci glisse dans le gestionnaire de tâches. (par exemple, Asus zenphone a la gestion de l'alimentation)
  2. ForegroundService empêchera l'application d'être inactive.
  3. Enregistrer ReconnectingManager
  4. Enregistrer Pingfailed
  5. Enregistrer ServerPingWithAlarmManager

Et c'est tout. Toutes les demandes, juste commentez ci-dessous :)

Meilleur regard R Aditya Gumay 

1
raditya gumay

Votre suggestion est valable pour une connexion avec TCP/IP jamais abandonnée. ce qui n'est pas le cas dans le réseau mobile 3G/4G. Donc, dans un vrai réseau 3G/4G, le client mobile/APP peut être en état de zombie (déconnecté) . C'est pourquoi vous avez besoin de Firebase/FCM pour pouvoir jouer.

0
TC Juan