Android supporta la notifica push quasi in tempo reale?


343

Di recente ho appreso della capacità delle app per iPhone di ricevere notifiche quasi istantanee alle notifiche delle app alle app .

Questo viene fornito sotto forma di notifiche push, un protocollo su misura che mantiene una connessione dati sempre attiva sull'iPhone e invia messaggi ai pacchetti binari all'app, che visualizza avvisi incredibilmente rapidamente, tra 0,5 e 5 secondi dall'app del server invia all'app del telefono tempo di risposta. Questo viene inviato come dati - anziché come SMS - in pacchetti molto piccoli addebitati come parte del piano dati e non come messaggi in arrivo.

Vorrei sapere se, utilizzando Android, esiste una funzione simile o se è possibile implementare qualcosa di simile utilizzando le API Android. Per chiarire, definisco simile a:

  • Non un messaggio SMS, ma una soluzione basata sui dati
  • Il più in tempo reale possibile
  • È scalabile, ovvero, poiché parte del server di un'app mobile, potrei notificare migliaia di istanze di app in pochi secondi

Apprezzo che l'app possa essere basata su pull, stile HTTP di richiesta / risposta, ma idealmente non voglio fare un polling così pesantemente solo per controllare la notifica; inoltre è come gocciolare il piano dati.


3
La notifica per gmail e gchat è generalmente entro tale soglia. Dovrebbe esserci un modo per replicarlo nella tua app.
Dana the Sane,

Sì, c'è una libreria Android che rende la messaggistica push molto semplice ... includi solo la libreria Notifiche Droid di Jigy nella tua app e da lì ci sono solo 10 righe di codice ... spero che questo aiuti :)
Corey Harden

Dai un'occhiata a Pushy ( pushy.me ) per un gateway di notifica push in tempo reale che utilizza MQTT sotto il cofano per una maggiore affidabilità. Divulgazione completa - Ho fondato Pushy.
Elad Nava,

Risposte:


215

Le domande frequenti su Firebase Cloud Messaging FCM sono la nuova versione di GCM. Eredita l'infrastruttura principale di GCM per recapitare i messaggi in modo affidabile su Android, iOS e Chrome. Tuttavia continueranno a supportare GCM perché molti sviluppatori utilizzano oggi SDK GCM per gestire le notifiche e l'aggiornamento delle app client richiede tempo.

A partire dal 26 giugno 2012, Google Cloud Messaging è il modo preferito di inviare messaggi alle applicazioni in esecuzione sui dispositivi.

In precedenza (e ora deprecato), il servizio era chiamato Cloud To Device Messaging .


14
Google fornisce la documentazione dettagliata per l'implementazione nella tua app Android in Java all'indirizzo code.google.com/android/c2dm ma manca il loro codice di esempio per comunicare con l'aspetto lato server di C2DM. Ho scritto un tutorial per questo aspetto qui: blog.boxedice.com/2010/10/07/…
DavidM

2
Esiste un modo per offrire notifiche push agli utenti con Android 2.2, ma rendere la stessa app eseguibile su vecchie distribuzioni, solo senza notifiche push?
OneWorld

3
@OneWorld: sì, proprio come qualsiasi altra tecnica di compatibilità con le versioni precedenti di Android, usa la riflessione per scegliere una strategia alternativa quando C2DM non è disponibile, per maggiori informazioni: developer.android.com/resources/articles/…
Lie Ryan

1
developer.android.com/videos/index.html#v=PLM4LajwDVc Google I / O 2010 Presentazione sulle notifiche push
vokilam

6
C2DM è stato ufficialmente deprecato a partire dal 26 giugno 2012, l'uso [Google Cloud Messaging per Android] ( developer.android.com/guide/google/gcm/index.html invece
Mithun Sreedharan

47

XMPP è una buona soluzione. L'ho usato per un'applicazione Android abilitata, in tempo reale, con push. XMPP è potente, altamente estensibile e facile da integrare e utilizzare.

Ci sono un sacco di server XMPP gratuiti (anche se per cortesia non dovresti abusarli) e ci sono server open source che puoi eseguire su una delle tue caselle. OpenFire è una scelta eccellente.

La libreria che desideri non è Smack come notato sopra, è aSmack . Ma nota, questo è un ambiente di compilazione: dovrai creare la libreria.

Questo è un calcolo che ho fatto sull'impatto sulla durata della batteria di una soluzione XMPP:

Il client Android deve mantenere una connessione TCP persistente svegliarsi periodicamente per inviare un battito cardiaco al server XMPP.
Ciò impone chiaramente un costo in termini di consumo di energia. Di seguito viene fornita una stima di questo costo:

  • Uso di una batteria da 1400 mAh (come fornita nel Nexus One e nell'HTC Desire)
  • Un dispositivo inattivo, collegato a una rete 3G, utilizza circa 5 mA
  • Il ciclo di sveglia, battito cardiaco, sonno si verifica ogni 5 minuti, richiede tre secondi per completare e utilizza 300 mA
  • Il costo nell'uso della batteria all'ora è quindi:
    • 36 secondi 300mA = 3mAh invio del battito cardiaco
    • 3600 secondi 5mA = 5mAh al minimo
    • 4:95 + 3 = 7: 95 mAh combinati
  • Una batteria da 1400 mAh dura circa 11,6 giorni al minimo e 7,3 giorni durante l'esecuzione dell'applicazione, il che rappresenta una riduzione approssimativa del 37% della durata della batteria.
  • Tuttavia, una riduzione della durata della batteria del 37% rappresenta il caso peggiore in assoluto dato che i dispositivi raramente sono completamente inattivi.

2
Tuttavia, in pratica il telefono durerà 3 ore quando le app lo fanno poiché centinaia di intenti vengono eseguiti quando il telefono si sveglia o visualizza gli accensioni o cambia lo stato della rete.
Monstieur,

33

Di recente ho iniziato a giocare con MQTT http://mqtt.org per Android come un modo per fare ciò che stai chiedendo (cioè non SMS ma guidato dai dati, consegna dei messaggi quasi immediata, scalabile, non polling, ecc.)

Ho un post sul blog con informazioni di base su questo nel caso in cui sia utile http://dalelane.co.uk/blog/?p=938

(Nota: MQTT è una tecnologia IBM e dovrei sottolineare che lavoro per IBM.)


Come sta facendo mqtt? Ci devono essere alcuni sondaggi coinvolti da qualche parte? Anche Apple deve effettuare il polling, ma penso che stiano facendo solo una connessione alla volta, quindi non consumano la batteria così tanto ...
Janusz

3
Lo fa aprendo una connessione TCP / IP e lasciandola aperta. Non esegue il polling, anche se occasionalmente deve inviare un piccolo messaggio ping lungo la connessione per mantenerlo attivo.
Dalelane,

MQTT è sicuramente la strada da percorrere se l'invio del tuo messaggio push tramite Google ti mette a disagio. Inoltre, abbiamo stipulato accordi di non divulgazione con i nostri clienti che vietano l'uso dei servizi cloud per gli scambi di dati.
VH-NZZ,

14

Dai un'occhiata alla piattaforma Xtify . Sembra che sia quello che stanno facendo,



8

Se puoi fare affidamento sul fatto che le librerie di Google sono lì per il tuo mercato di riferimento, allora potresti voler ripercorrere le funzionalità di GTalk (registrando una risorsa sul nome utente esistente - intercettandolo i messaggi come arrivano con un BroadcastReceiver).

In caso contrario, e mi aspetto che tu non possa , allora ti piacciono le tue versioni di XMPP . Questo è un problema, ma può essere semplificato se XMPP è raggruppato separatamente come libreria autonoma.

Puoi anche considerare PubSubHubub , ma non ho idea dell'uso della rete. Credo che sia costruito in cima a XMPP.


Penso che le statistiche dell'articolo che la funzionalità piggy back saranno sempre disponibili fintanto che le librerie gtalk sono sul dispositivo. Hai delle risorse con esempi su come farlo?
Janusz,

GTalk viene rimosso dall'SDK da 1.0 (iirc).
MrSnowflake,

8

Ho esaminato questo e PubSubHubBub raccomandato da James non è un'opzione. PubSubHubBub è destinato alle comunicazioni da server a server

"Sono dietro un NAT. Posso abbonarmi a un Hub? L'hub non può connettersi a me."

/Anonimo

No, PSHB è un protocollo da server a server. Se sei dietro NAT, non sei proprio un server. Mentre abbiamo preso in giro idee per estensioni PSHB opzionali per impiccare ("polling lungo") e / o polling messagebox per tali client, non è nelle specifiche di base. Le specifiche principali sono solo da server a server.

/ Brad Fitzpatrick, San Francisco, California

Fonte: http://moderator.appspot.com/#15/e=43e1a&t=426ac&f=b0c2d (collegamento diretto non possibile)

Sono giunto alla conclusione che il metodo più semplice è usare il push HTTP Comet. Questa è una soluzione semplice e ben compresa, ma può anche essere riutilizzata per le applicazioni web.


8

C'è un nuovo sforzo open source per sviluppare una libreria Java per le notifiche push su Android, usando il server cometa Meteor come backend. Puoi dare un'occhiata al Deacon Project Blog . Abbiamo bisogno di sviluppatori, quindi per favore spargi la voce!


7

Google di recente (18 maggio 2016) ha annunciato che Firebase è ora la sua piattaforma unificata per gli sviluppatori mobili, comprese le notifiche push quasi in tempo reale, nonché multipiattaforma:

La società offre ora a tutti gli utenti Firebase notifiche gratuite e illimitate con supporto per iOS, Android e Web.

fonte


6

Non riesco a trovare dove l'ho letto, ma credo che gmail utilizzi una connessione TCP aperta per eseguire il push della posta elettronica.


C'è un post sul blog su joelapenna.com/blog/2009/07/android-foursquare-and-push di uno sviluppatore di un'app Android che sembra supportare questo.
Dalelane,

Mi sembrano, anche loro stanno sondando. Il dispositivo mobile effettua una connessione al server e notifica al server che è in attesa di aggiornamenti. Il push effettivo viene avviato dal server, il che è molto difficile per i dispositivi mobili e il più delle volte comporta il supporto del provider di rete (sms / wap push) ...
MrSnowflake

1
"C2DM consente agli sviluppatori di terze parti di utilizzare lo stesso servizio delle app di Google." da Android Cloud a Device Messaging
colithium

6

Come GTalkè andato dall'SDK, potrebbe essere una buona idea creare un sistema di messaggistica push "standard". In questo modo, deve essere eseguito solo un servizio, deve essere aperta solo una connessione tcp aggiuntiva. Le applicazioni dovrebbero parlare con questo servizio usando Intentse dovrebbero prima richiedere l'autorizzazione per inviare e ricevere notifiche dal servizio. Il servizio dovrebbe quindi avvisare l'utente che una nuova applicazione desidera inviare e ricevere messaggi. L'utente quindi concederà o negherà l'autorizzazione, in modo da mantenere il controllo. L'applicazione registrerà quindi un'azione + categoria al servizio, in modo che il servizio sappia come recapitare il messaggio inviato.

Sarebbe una buona idea o no?


6

Perché non andare con l'implementazione di XMPP. in questo momento ci sono così tanti server pubblici disponibili tra cui gtalk, jabber, cittadella ecc. Per Android è disponibile anche un SDK chiamato SMACK. Questo non possiamo dire una notifica push ma usando XMPP è possibile mantenere aperta una connessione tra client e server che consentirà una comunicazione bidirezionale. Significa che client e server Android possono comunicare tra loro. Al momento questo soddisferà la necessità di Push in Android. Ho implementato un codice di esempio e funziona davvero alla grande


Vuoi fornire un link al tuo codice di esempio? Hai fatto qualche test sulla durata della batteria?
Alex,

Ho effettuato dei test sulla durata della batteria: il battito cardiaco che devi inviare ogni sei minuti riduce la durata della batteria del 30% nel peggiore dei casi (ad esempio, il dispositivo si sveglia solo per inviare un battito cardiaco). Nel migliore dei casi (l'utente utilizza il dispositivo per la navigazione, le chiamate, ecc.), L'impatto sulla durata della batteria è trascurabile.
carne

6

Di recente ho sviluppato http://pushdroid.org è una singola applicazione che dovrebbe essere installata sul telefono proprio come Google l'ha implementata in 2.2, funziona da 1.5 e trasmette tramite intento.


4

Il problema con GCM è che c'è molta configurazione coinvolta nel processo:

  • Devi aggiungere molta caldaia alla tua app Android
  • È necessario configurare un server esterno per comunicare con il server GCM
  • Dovrai scrivere dei test

Se ti piacciono le cose semplici (come me) dovresti provare UrbanAirship . È (IMHO) il modo più semplice per usare GCM nella tua app senza fare molta configurazione. Ti dà anche una bella interfaccia grafica per testare che i tuoi messaggi GCM vengano recapitati correttamente.

  • Puoi trovare i documenti e la guida introduttiva qui
  • Puoi trovare un'applicazione di esempio qui

Nota: non sono affiliato con UrbanAirship in alcun modo



2

Hanno i loro ascoltatori che devono essere usati da te usando le loro classi di libreria nel tuo codice. Non devi preoccuparti di spingere. Devi inviare il messaggio al server server invierà il messaggio al dispositivo. Usano OAuth. Per quanto riguarda i protocolli, esistono due metodi che utilizzano CCS e XMPP. CCS utilizza XMPP come livello di trasporto autenticato, quindi è possibile utilizzare la maggior parte delle librerie XMPP per gestire la connessione. Per inviare notifiche al dispositivo puoi scrivere il codice nell'app Android da inviare e il codice del tuo server. l'invio del messaggio sarà effettuato solo dal tuo codice. Il resto sarà curato da Google Server nel caso GCM. Puoi controllare i dettagli a questo link

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

Inoltre, per problemi di sicurezza

google cloud messaging security https://groups.google.com/forum/#!topic/android-gcm/M-EevBitbhQ

Nel caso in cui la tua app non sia in esecuzione, anche i dispositivi possono ricevere notifiche perché devi scrivere codice per i listener di trasmissione. In background ascolterà il server e ogni volta che un pacchetto di messaggi sarà presente, riceverà il messaggio come notifica. Android ha un servizio di cui non devi preoccuparti. Devi solo usare quelle risorse usando la classe di libreria che semplifica il tuo lavoro e lasciali scrivere se la tua app non è in esecuzione, quindi riceve anche la notifica. Ovviamente, ci sarebbe qualche ascoltatore a cui l'app dovrebbe ricevere. Controlla la sezione "Ricevi il messaggio" in questo link

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

Accetterà anche la richiesta degli utenti. Per GCM lo farà. Controlla "Invia un messaggio"

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.