12

Sto sviluppando un'app di chat per Android. Ho letto per settimane su XMPP e Google Cloud Messaging (e Firebase Cloud Messaging) e sono ancora molto confuso.App di chat per Android che utilizza un server XMPP e Google Cloud Messaging (o la nuova Firebase Cloud Messaging) per notifiche push

Attualmente, ho già configurato un server XMPP localmente (Ejabberd) e collegato correttamente la mia app Android utilizzando la libreria Smack.

A mio parere, ho bisogno di utilizzare GCM o il nuovo FCM per le notifiche push, quindi ho già creato un progetto in Google Cloud Platform. La mia app per Android può connettersi anche usando la libreria Smack (invece di connettersi direttamente al mio server XMPP). Nel mio server ho una piccola app Java che si collega a GCM usando anche la libreria Smack.

Tutto va bene fino a qui. La mia grande confusione è: Come posso utilizzare il mio server XMPP con GCM per le notifiche push? Ogni documentazione, esempi, guide, tutorial che ho trovato per implementazioni lato server mi dicono come collegarmi a GCM ma nessuno mi dice come usare il mio server XMPP in combinazione con GCM. Cosa mi manca? La mia app Java si collega semplicemente a GCM, riceve e invia messaggi da e verso GCM, ma il mio server XMPP è seduto lì senza fare nulla. In realtà la mia app Android e l'app Java del server utilizzano esclusivamente GCM, non il mio server XMPP.

Spero che qualcuno possa aiutarmi a capire tutto questo, mi mancano ovviamente alcuni elementi chiave per raggiungere questa implementazione.

+0

Hey SF, mi puoi aiutare con il collegamento di server XMPP per Android? –

+0

puoi ottenere la risposta? –

+0

puoi per favore aiutarmi sto affrontando lo stesso problema qui http://stackoverflow.com/questions/41630978/how-to-use-smack-4-1-for-how-to-send-info-query-packet -to-xmpp-server –

risposta

9

È necessario unire sia Ejabberd che FCM insieme, è così che tutte le app di chat di grandi dimensioni lo fanno fuori. Per le basi, ci sono 3 componenti: App Server connesso tramite XMPP a FCM, Ejabberd e la tua app client.

  1. Quando l'applicazione è in primo piano, si utilizza biblioteca Smack per connettersi direttamente al server ejabberd, inviare messaggi, presenza cambiamento d'uso, ecc La connessione al ejabberd è tenuti in quel periodo. È non inviare messaggi a monte durante questo periodo!
  2. Una volta che l'utente si allontana dall'app, è chiudi la connessione. L'utente è ora considerato "Fuori" o "Offline".
  3. Da questo momento in poi, l'App Server comunica con FCM per inviare messaggi downstream al dispositivo utilizzando la libreria Smack.
  4. Sul dispositivo client: si gestisce il messaggio in arrivo e si visualizza una notifica. Con Android N, gli utenti possono rispondere direttamente dalla notifica. Suppongo che in questo caso, si utilizzerebbe FCM per inviare un messaggio a monte al proprio server delle app poiché durante tale periodo non è attiva alcuna connessione al server Ejabberd.
  5. Una volta che l'utente tocca la notifica, l'applicazione torna al primo piano e si ricollegare a ejabberd e ritorno al punto 1.

Questa è la descrizione di base di architettura si dovrebbe avere per ottenere quello che vuoi.

+0

Nel passaggio 1 quando si dice "Non si inviano messaggi upstream durante questo periodo", si intende i messaggi upstream ** in FCM ** giusto? In altre parole, il dispositivo client invia sempre messaggi direttamente a Ejabberd quando è in primo piano. Il dispositivo client riceve messaggi da FCM ed Ejabberd o solo da FCM? –

+1

Sì, mi sono riferito a FCM. Il dispositivo client riceve messaggi da Ejabberd. Mentre l'app è in background, si utilizza FCM per notificare al dispositivo nuovi messaggi. Anche se è possibile inviare il carico utile fino a 4KB con FCM, suggerisco di inviare solo un messaggio di tipo "push-to-sync" utilizzando FCM e ottenere i messaggi effettivi da Ejabberd. Quindi Ejabberd è il principale archivio dati per tutti i messaggi e il tuo App Server con messaggi downstream FCM è dedicato a una sola cosa - rendendo il client sincronizzato con Ejabberd. Ciò significa anche che Ejabberd e il tuo server delle applicazioni devono comunicare, naturalmente. –

+1

Ora ho bisogno di sapere come collegare Ejabberd e il server delle app. A proposito, ho già installato e lanciato l'app client usando solo FCM per downstream e upstream senza problemi, ho bisogno di usare Ejabberd anche per questioni di scalabilità, giusto? Quali sono i limiti di un approccio solo FCM? –

4

È necessario configurare un server Java che si connetta a FCM (precedentemente GCM). Quindi, dal dispositivo è possibile inviare un messaggio a monte a FCM che quindi invia tale messaggio a monte al server java e quindi all'interno di tale server Java è possibile gestire tale messaggio a monte per inviare un messaggio a valle ai dispositivi di destinazione. Quindi sul lato dispositivo è possibile gestire i messaggi downstream ricevuti per fornire una notifica push.

Alcuni link utili:

Come inviare un messaggio a monte:
https://firebase.google.com/docs/cloud-messaging/upstream#sample-send

Come ricevere e gestire i messaggi di valle:
https://firebase.google.com/docs/cloud-messaging/downstream#sample-receive

Come ho impostato su un server Java di esempio:
https://stackoverflow.com/a/38170310/4433653

+0

Davvero grazie per la tua risposta, ma sono ancora confuso. Ho già un server Java che si collega a FCM (molto simile al codice di quel collegamento), ma funziona senza il mio server XMPP, usa solo FCM per tutto. Cosa mi manca? –

+0

FCM ha due protocolli supportati HTTP e XMPP. HTTP è usato per inviare SOLO messaggi dal tuo server, attraverso FCM, al tuo dispositivo. XMPP consente sia i messaggi da server a dispositivo e da dispositivo a server, sia tramite FCM. –

+0

@ArthurThompson Giusto, quindi ... ** Come posso utilizzare il mio server XMPP con FCM per notifiche push? **, Ogni implementazione, esempio, guida che ho trovato (incluso quello nel link di questa risposta) basta usare e spiegare la parte FCM, che dire di XMPP? Il server Java funziona senza che il mio server XMPP sia in esecuzione. –

4

Questo è un progetto java di esempio per mostrare il server di connessione XMPP Firebase Cloud Messaging (FCM). Questo progetto è un server standalone molto semplice che ho sviluppato come base di un progetto più ampio. È un application server che dobbiamo implementare nel nostro ambiente. Questo server invia i dati a un'app client tramite il server CCS CCM utilizzando il protocollo XMPP.

https://github.com/carlosCharz/fcmxmppserver

e anche io ho creato un video in youtube in cui spiego che cosa fa.

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

Spero vi sia utile.

+2

Mentre questo link può rispondere alla domanda, è meglio includere il parti essenziali della risposta qui e fornire il collegamento per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - [Dalla recensione] (/ recensione/post di bassa qualità/13765377) – JiTHiN

+0

Prenderò in considerazione il tuo parere in ulteriori commenti. Grazie! –

+0

@ CarlosBecerraRodríguez ho provato ad implementare il tuo server su google cloud module (endpoint) ma ottengo un errore e non vengono inviati messaggi downstream. L'errore –

1

Sto anche creando un'applicazione di chat in Android usando Smack v.4.1.8 quale ultima versione di Smack, e il nostro server sta usando ejabberd. Non utilizzo terze parti come GCM o Firebase per inviare messaggi downstream dal messaggio dell'utente a quello dell'utente. Se non sbaglio, userete GCM o Firebase per inviare un messaggio all'utente, se sì, non farlo.

Perché? Il protocollo TCP continua ad ascoltare un listener di richiamo che è stato registrato nell'app quando la connessione è stabilita e ancora connessa. Smack ha un ascoltatore che ha chiamato "addAsyncStanzaListener()"

addAsyncStanzaListener viene utilizzato per ascoltare un pacchetto di ricezione in App. Loro hanno

public void processPacket(Stanza packet) 

Puoi invocare quello, e ascolterai il pacchetto nel tempo.

Faccio una ricerca sulla connessione stabile di Smack. La maggior parte degli smartphone Android ha ciascuna configurazione e restrizione. Non possiamo testare tutti i dispositivi. Ecco i miei consigli per mantenere stabile il collegamento:

  1. Usa ForegroundService invece BackgroundService, vi propongo questo approccio perché la maggior parte del dispositivo Android hanno restrizione di un app che eseguito in background. Uccideranno l'app quando l'app passerà dal task manager. (ad esempio, Asus zenphone ha la gestione energetica)
  2. ForegroundService impedirà l'inattività dell'app.
  3. Registrati ReconnectingManager
  4. Registrati Pingfailed
  5. Registrati ServerPingWithAlarmManager

E questo è tutto. Eventuali richieste di informazioni, proprio commento qui sotto :)

Miglior Regard R Aditya Gumay

Problemi correlati