2013-05-15 11 views
8

Ho un'app per Android che si basa su notifiche push GCM e, a volte, il dispositivo dell'utente smetterà di ricevere notifiche push. Il comportamento è abbastanza intermittente: su alcuni dispositivi, non fallirà mai e continuerà a funzionare per settimane o mesi, mentre su altri dispositivi, funzionerà per alcuni giorni, e poi smetterà semplicemente di ricevere push.Il dispositivo smette di ricevere messaggi GCM finché la rete non viene commutata

Ogni volta che il dispositivo ha smesso di funzionare, ho verificato che il dispositivo ha un codice valido da GCM e che il mio server sta inviando push a quel regId. Tuttavia, i registri mostrano che il dispositivo non sta ricevendo nulla. Ecco quello che i log su una spinta normale ricevono assomiglia:

05-15 10:39:21.091: V/GCMBroadcastReceiver(13766): onReceive: com.google.android.c2dm.intent.RECEIVE 
05-15 10:39:21.091: V/GCMBroadcastReceiver(13766): GCM IntentService class: com.medigram.v2.GCMIntentService 
05-15 10:39:21.091: V/GCMBaseIntentService(13766): Acquiring wakelock 
05-15 10:39:21.111: V/GCMBaseIntentService(13766): Intent service name: GCMIntentService-468134393228-13 
05-15 10:39:21.131: V/GCMBaseIntentService(13766): Releasing wakelock 
05-15 10:39:21.171: V/GCMBroadcastReceiver(13766): onReceive: com.google.android.c2dm.intent.RECEIVE 
05-15 10:39:21.171: V/GCMBroadcastReceiver(13766): GCM IntentService class: com.medigram.v2.GCMIntentService 
05-15 10:39:21.171: V/GCMBaseIntentService(13766): Acquiring wakelock 
05-15 10:39:21.241: V/GCMBaseIntentService(13766): Intent service name: GCMIntentService-468134393228-14 
05-15 10:39:21.271: V/GCMBaseIntentService(13766): Releasing wakelock 

Niente di tutto questo si presenta sui dispositivi che hanno smesso di ricevere spinte, e, di conseguenza, non è il metodo onMessage() della mia GCMIntentService chiamato .

La cosa strana è che quando passo la connessione del dispositivo da 3G/4G a Wi-Fi o viceversa, riprende a funzionare, e il dispositivo riceve tutti i push back-back in una volta. Cosa succede esattamente quando il tipo di connessione cambia?

In caso aiuta, qui ci sono alcune cose che ho provato su dispositivi in ​​cui spinta sta lavorando per riprodurre manualmente il problema, ma senza alcun risultato:

-I primo pensiero potrebbe essere un problema di contesto, ma questo fu presto escluso quando il semplice cambio di rete risolse il problema. Ho provato a indagare ulteriormente utilizzando l'opzione di sviluppo 'Non tenere attività' e quindi eseguendo il backup dell'applicazione, ma ciò non ha avuto alcun effetto su push.

-Io ho provato a forzare l'arresto dell'applicazione per vedere se avrebbe causato il blocco del funzionamento, ma il problema non sembra avere nulla a che fare con l'arresto della forza dell'applicazione, poiché continua a funzionare.

-Ho provato a mettere il telefono in modalità aereo e tornare indietro, ma ho continuato a lavorare.

Apprezzerei molto se qualcuno potesse indicarmi la giusta direzione, poiché ho praticamente esaurito tutte le risorse su StackOverflow e Google. Sono ancora altrettanto clueless su questo problema come quando ho iniziato.

+2

possibile duplicato [this] (http://stackoverflow.com/questions/13835676/google-cloud-messaging-messages-sometimes-not-received-until-network-state-cha) – Eran

+0

Puoi fornire una panoramica dei progetti etup? È un progetto di biblioteca? La tua app invoca la gestione GCM da un progetto di libreria? In quali circostanze la tua app si registra su GCM e annulla la registrazione? –

+0

Hai trovato una soluzione per questo? Anche io sto affrontando lo stesso problema. – keen

risposta

0

In genere Android invia un heartbeat ogni 28 minuti sulla connessione mobile e ogni 15 minuti su Wifi, quindi è possibile risolvere questo problema trasmettendo questi due intenti in un intervallo più breve dall'app.

com.google.android.intent.action.MCS_HEARTBEAT

com.google.android.intent.action.GTALK_HEARTBEAT

 Intent intent = new Intent("com.google.android.intent.action.MCS_HEARTBEAT"); 
     Intent intent1 = new Intent("com.google.android.intent.action.GTALK_HEARTBEAT"); 
     sendBroadcast(intent); 
     sendBroadcast(intent1); 

si può leggere nel dettaglio here

Problemi correlati