2012-05-24 20 views

risposta

4

Lo scopo previsto di Android C2DM deve essere un modo di risparmio della batteria per l'app del server per segnalare al dispositivo mobile che desidera avviare comunicazioni affidabili.

È possibile strutturare il messaggio in modo che ogni nuovo C2DM racchiuda tutto ciò che si è verificato dall'ultima interazione a due vie con il server (ad esempio, "vieni e ottieni ciò che ho"). Il tuo rapporto di consegna non riuscito è implicito nel fatto che il dispositivo mobile non risponde prontamente (puoi farlo perché sai che C2DM attiva la tua app con Intento).

È davvero peggio che la consegna garantita di ogni messaggio in un mezzo con perdite? Va bene, è peggio in quanto devi anche implementare un metodo di comunicazione primario. Ma dovevi farlo comunque perché C2DM è solo in entrata, giusto?

+0

Grazie! Penso che sia adatto a qualsiasi servizio basato su push che non sia affidabile. Valuterò ogni risposta e assegnerò il migliore per me. –

2

Come dice Vinay, MQTT può offrirti la funzione che desideri. Quando un client si connette al server, può registrare un messaggio "ultimo testamento e testamento" con il server. Se il client si disconnette inaspettatamente, il server invia questo messaggio all'argomento che è stato richiesto di fare.

In questo schema, il client può inviare un messaggio "online" a qualcosa come lo stato di client // e registrare il messaggio "offline" come LWT per lo stesso argomento. Potresti quindi avere un client locale del server che ha ascoltato il client topic/+/status e che avrebbe saputo quali client erano online e quali offline.

Suggerirei che la demo tokudu non è il posto migliore per guardare. Questo post del blog di Dale Lane, fornisce una visione in utilizzando MQTT su Android: http://dalelane.co.uk/blog/?p=1599 e non v'è una revisione di consumo di energia MQTT (ancora una volta su Android) a http://stephendnicholas.com/archives/219

Ci sono implementazioni client per soddisfare sia IOS e Android, vedere http://mqtt.org/software

+0

Grazie per la risposta! Rispondi in primo luogo per la tua risposta. –

+3

Ed ecco un altro confronto sull'uso dell'energia, questa volta su https: http://stephendnicholas.com/archives/1217 – ralight

2

Nessun servizio non fornisce rapporti su spinte non riuscite.

rapporto spinta Impossibile fa poca sence con APN/C2DM/Elio

Tutti i servizi sono finalizzati a fornire il push-messaggio in tutte le circostanze. Se il dispositivo non è in linea ora, quindi push verrà consegnato quando il dispositivo diventa online.

Inoltre, per iOS il messaggio push è solo una notifica per un utente, non per un'applicazione!

Il caso semplice lo illustrerà: Si supponga che il push venga ricevuto quando l'applicazione viene disattivata. In tal caso, si verificherà la notifica per l'utente. Ma, l'applicazione riceverà dati da push, solo se l'utente tocca questa notifica! Se l'utente tocca l'icona dell'applicazione, i dati non verranno ricevuti.

Quindi, tecnicamente, il push viene consegnato al dispositivo iOS e l'applicazione viene avviata, ma i dati non vengono consegnati.

UrbanAirhip con APN e Elio

Si può considerare per implementare il proprio mezzo di trasporto per spinte. MQTT sembra essere una buona opzione. Ma in questo caso, devi occuparti di keepalive, sleep dei dispositivi e ottimizzazioni della batteria. Tutto questo duro lavoro è già stato fatto dagli ingegneri di Apple, Google e UrbanAirship.

A seconda delle esigenze aziendali, può essere più semplice adattare l'architettura per le soluzioni esistenti, quindi reimplementare il servizio push nuovamente.

Dai un'occhiata più da vicino a UrbanAirship. In effetti, C2DM ha alcune limitazioni e talvolta i tempi per la consegna del messaggio push sono troppo grandi. Per questo UA ha implementato il proprio trasporto - l'elio, funziona piuttosto bene. L'elio è un servizio a pagamento, ma UA offre un buon SLA.

1

Ho fatto qualcosa di simile dove avevo un database per tenere traccia delle code di push verso gli abbonati noti e ho segnalato quando non ci sono riusciti. E 'stato molto semplice e andato qualcosa di simile ...

The schema was like so: 

pushMessages 
    messageID , GUID, PK 
    message , nvarchar (256), 
    expires , datetime 

messageQueues 
    subscriberID , GUID, PK 
    messageID , GUID PK 

failedPushMessages 
    subscriberID, GUID, PK 
    messageID , GUID PK 

(subscriber table omitted) 

Una volta che un cliente ha ricevuto il messaggio con successo, il cliente avrebbe il ping al server spinta e notifica tramite il queueItems ID univoco che ha ricevuto sulla spinta notifica. Ci sarebbe anche un processo giornaliero di database che controllerebbe i messaggi push scaduti. Una volta trovato, farebbe un join sulla codaMessaggi corrispondenti al messageID, quindi rimuoverli dalla tabella messagesQueues e copiarli nella tabella failedPushMessages.

Questo è stato molto facile da capire e mantenere, ma non ho esperienza di farlo in un altro modo.

0

I servizi di invio sono un modo efficace e affidabile per avvisare gli utenti. Permettono anche alle applicazioni in background di informare gli utenti di nuove informazioni in tempo reale. I servizi push sono ampiamente utilizzati per una varietà di campi nelle applicazioni mobili, come gli aggiornamenti meteo, i servizi di messaggistica, la notifica della posta, i servizi di coupon e così via. I servizi push non sono più opzionali ma sono diventati essenziali.

Problemi correlati