7

L'applicazione è in PhoneGap. Sto usando la funzionalità di notifica push con https://github.com/marknutter/GCM-CordovaGCM Cordova Push Notification non funziona quando l'app non è in esecuzione

Ho implementato l'intera funzionalità e ha funzionato fino a ieri. Quando ho controllato l'app lo scorso giorno, la notifica push non funziona quando l'app non è in esecuzione. Tutte le notifiche vengono ricevute sul mio dispositivo, facendo clic sul messaggio si apre l'app.

Ma i controlli non vengono ricevuti nella parte javascript dove viene gestita la notifica del messaggio.

codice dal file GCMIntentService.java:

JSONObject json; 
json = new JSONObject().put("event", "message"); 

json.put("message", extras.getString("message")); 
json.put("link", extras.getString("link")); 

Log.v(ME + ":onMessage ", json.toString()); 

GCMPlugin.sendJavascript(json); 
// Send the MESSAGE to the Javascript application 

Questo codice funziona quando il messaggio ricevuto. Ma a quel tempo, l'App non è in esecuzione.

Quando faccio clic sul messaggio di notifica, l'app si apre come al solito, non registrando l'evento del messaggio; quindi non ottenere il controllo in JavaScript per gestire la notifica push.

Codice in CORDOVA_GCM_script.js è disponibile all'indirizzo:

https://github.com/marknutter/GCM-Cordova/blob/master/assets/www/CORDOVA_GCM_script.js

Nota: Funziona bene quando l'applicazione è in esecuzione.

EDIT: La notifica corre a volte. JavaScript sta ottenendo l'evento del messaggio in modo casuale.

EDIT 2:

ho sicuramente conoscono il problema.

Dal file java, attiva il codice javascript quando si apre l'app facendo clic sul messaggio di notifica push. Ma a quel tempo, la WebView non è caricata, quindi non è in grado di eseguire lo script (che è un trigger di evento). Questa è la condizione, chiunque utilizzi il plug-in sperimenterà lo stesso. C'è qualche soluzione o una soluzione per questo?

Sto facendo qualcosa di sbagliato?

+0

il punto di notifica push è che venga eseguito in background quando la vostra applicazione non è in esecuzione. Quindi, se la tua app non è in esecuzione e in questo caso, essendo una WebView, non penso che riceverà nulla dal lato nativo dal momento che la JVM non esegue WebView in background che spiega perché la tua parte JS non lo fa t eseguire quando l'app non è in esecuzione. È necessario considerare l'archiviazione dei dati di notifica in preferenze condivise o qualcosa del genere quando si riceve la notifica push; esamina ogni volta che la tua app viene avviata in modo da poter reagire. – praneetloke

+0

Questa è un'implementazione comune e non ho riscontrato problemi segnalati da altri, che mi confondono .. – IvenMS

risposta

3

ho trovato una soluzione semplice. Nel GCMIntentService, prima di inviare javascript controllo se il WebView è caricato:

while (GCMPlugin.gwebView == null || GCMPlugin.gwebView.webView == null || !GCMPlugin.gwebView.webView.isEnabled()) { 
    // Wait until webView is enabled 
} 
GCMPlugin.sendJavascript(json); 

Questo funziona per me ... forse è una buona scelta per aggiungere anche un timeout al fine di evitare un ciclo infinito (Non dovrebbe 't accadere, ma ...)

Davide

3

IvenMS - Anche io ho lo stesso problema, quindi non sei l'unico. Se capisco praneetloke correttamente, le notifiche push non funzioneranno con le app PhoneGap che non sono attualmente in esecuzione.

+0

Non c'è niente come non eseguire l'app. L'app verrà eseguita in background ininterrottamente o le sue istanze verranno eseguite. Quando i messaggi vengono inviati dal server, l'applicazione otterrà il controllo e registrerà il messaggio in JavaCode. Posso vedere la registrazione con JavaCode. Il codice prova anche a invocare javascript. A quel tempo, la webview non è stata caricata. Cliccando sul messaggio di notifica, l'app caricherà e quindi la webview. Ma in quel momento, l'evento di notifica (che viene avviato da JavaCode al momento della ricezione della notifica) non verrà richiamato. – IvenMS

4

L'utilizzo del plugin GCM-Cordova non gestirà correttamente la notifica se l'applicazione non è in esecuzione. È perché la WebView non è stata caricata nel momento in cui il plugin avvia il javascript.

Soluzione:

  • modificato il codice del plugin per salvare i dati dei messaggi come temporaneo quando la comunicazione arriva.
  • Creato un altro plug-in con metodi per leggere questi dati caricati e cancellare i dati.
  • Chiama il mio metodo plugin personalizzato su deviceready e controlla se ci sono dati.
  • Se presente, cancellare i dati memorizzati localmente e richiamare il metodo per mostrare il messaggio di avviso.

Finalmente in grado di risolvere questo problema con l'aiuto di due plugin - GCM-Cordova e plugin personalizzato.

+2

Questo non risolve il problema per me perché i dati che invio nel messaggio vengono utilizzati per impostare allarmi sul telefono e l'utente non può ri-visitare l'app. – BallisticPugh

+0

Se si sta creando un plug-in personalizzato, questo verrà eseguito nel momento in cui arriva la notifica (o l'utente fa clic sulla notifica). È possibile impostare il codice di allarme all'interno del codice del plugin personalizzato. Vorrei condividere il mio codice, ma sto lavorando per un'azienda IT e il codice è strettamente protetto. – IvenMS

+0

Purtroppo ho un sacco di codice seduto all'interno della funzione di callback javascript ora e sarebbe un lavoro sostanziale riscrivendo tutto e semplicemente non ho tempo. La mia soluzione, e questo è tutt'altro che ideale, è quella di avviare l'app se non è in esecuzione quando viene ricevuto un messaggio push, quindi attendere cinque secondi per caricarlo e quindi elaborare il push. Funziona ma, ovviamente, l'utente non sarà troppo impressionato dal fatto che la sua app stia avviando senza che questo venga attivato. – BallisticPugh