CERCA
PER MODELLO
FullScreen Chatbox! :)

Utente del giorno: carotix con ben 2 Thanks ricevuti nelle ultime 24 ore
Utente della settimana: 9mm con ben 9 Thanks ricevuti negli ultimi sette giorni
Utente del mese: 9mm con ben 34 Thanks ricevuti nell'ultimo mese

Visualizzazione dei risultati da 1 a 3 su 3
Discussione:

[MEDIO] Google Cloud Messaging (GCM)

Se questa discussione ti è stata utile, ti preghiamo di lasciare un messaggio di feedback in modo che possa essere preziosa in futuro anche per altri utenti come te!
  1. #1
    Androidiani Power User L'avatar di Crotan


    Registrato dal
    Jul 2013
    Località
    Roma
    Messaggi
    1,265
    Smartphone
    Redmi Note 9 Pro

    Ringraziamenti
    401
    Ringraziato 1,445 volte in 626 Posts
    Predefinito

    [MEDIO] Google Cloud Messaging (GCM)


    Google Cloud Messaging (GCM) è un servizio gratuito fornito dall'omonima azienda che consente di inviare messaggi push da un server web verso un'applicazione o un'estensione Chrome.

    Per poter utilizzare correttamente il servizio sarà necessario disporre dell'ultima versione della libreria Google Play Services integrata nel progetto e del relativo apk installato sul dispositivo mobile.

    Funzionamento
    La piattaforma GCM rende possibile l'invio di notifiche push grazie all'interazione tra tre attori: l'applicazione Android, un'applicazione server e GCM.


    Spoiler:


    All'avvio dell'applicazione Android che implementa i servizi GCM, per prima cosa occorre registrare l'app presso il server GCM, dal quale si otterrà un ID, che dovrà essere memorizzato sul nostro server web. Tale procedura è riassunta nell'illustrazione sottostante.

    Spoiler:


    In seguito, se non si vorranno più ricevere messaggi dal server web, sarà sufficiente eliminare dal database l'ID di registrazione.

    In sequenza le fasi da rispettare per una corretta implementazione del servizio sono:


    1. Registrare l'applicazione Android sul server di GCM al primo avvio
    2. Dall'operazione di cui sopra si otterrà un ID alfanumerico che identifica l'applicazione e che dovrà essere memorizzato sulla vostra implementazione web (l'applicazione server)
    3. Se l'esito del punto due è positivo, salvare un valore booleano vero utilizzando le SharedPreferences
    4. Implementare un servizio per definire le operazioni da eseguire alla ricezione di un messaggio


    Implementazione
    Per comodità ed una migliore comprensione distingueremo le implementazioni in lato client e lato server.

    Implementazione lato client
    Il primo passo da fare è ottenere la Server API Key ovvero un identificatore alfanumerico che ci consentirà di comunicare con il server di GCM mediante l'applicazione web. Con la medesima procedura (illustrata a breve) si otterrà un Sender ID ossia un identificatore numerico che identifica il progetto sui server Google e autorizza l'applicazione server a comunicare con il client GCM. Per ottenere questi dati sarà sufficiente collegarsi al seguente sito, Add Google Services, e compilare il modulo inserendo tutte le informazioni richieste.

    Successivamente, nel vostro progetto Android, entrare nell'AndroidManifest ed aggiungere i seguenti permessi:



    Il permesso android.permission.INTERNET serve per consentire l'invio dell'ID alfanumerico che il server GCM ci restituirà all'applicazione web; android.permission.WAKE_LOCK assicurerà che il processore non si assopisca e possa ricevere correttamente i messaggi; com.vostro.packagename.permission.C2D_MESSAGE permette all'applicazione di ricevere ed inviare i messaggi, evitando che altre apps possano ricevere quei messaggi.

    Aggiungere a corredo un BroadcastReceiver che avrà il compito di intercettare le richieste GCM.



    Attenzione: l'action com.google.android.c2dm.intent.REGISTRATION serve per supportare le versioni di Android inferiori alla 4.4 (KitKat). Senza questa dichiarazione GCM non funzionerà su API inferiori alle 19.

    Inserire i seguenti servizi:



    GCMListenerService è il servizio che useremo per ricevere i messaggi e mostrare la relativa notifica; IDListenerService permetterà la gestione dell'id di registrazione a GCM richiamando il servizio RegistrationIntentService che amministerà la registrazione al server GCM e all'applicazione web.

    Una volta configurato l'AndroidManifest come su esposto l'app sarà pronta per ricevere messaggi. Tutto quel che rimane da fare è implementare i servizi. Il primo sarà RegistrationIntentService poichè in ordine cronologico la prima operazione da eseguire è registrare l'applicazione a GCM e al nostro web-server.



    Il metodo getToken() permette di ottenere l'ID di registrazione sul server GCM basandosi sul Sender ID passato come parametro. Questo metodo non deve mai essere eseguito sul thread della UI, pena crash. Una volta ottenuto il token lo inseriamo in un JSONObject e lo inviamo al nostro web-server per registrarlo nel database. L'implementazione di come e attraverso quali strumenti inviarlo su protocollo HTTP è una vostra scelta; personalmente suggerisco l'utilizzo della libreria OkHttp che gestisce gran parte degli aspetti lasciando all'utente il mero onere di passare il dato da inviare e l'URL.

    Il servizio successivo è IDListenerService che dovrà estendere la classe InstanceIDListenerService e riscrivere il metodo onTokenRefresh() che viene richiamato quando l'ID GCM subisce delle modifiche. Pertanto, quando verrà richiamato non dovrà far altro che avviare il servizio RegistrationIntentService per registrare il nuovo ID GCM.



    L'ultimo servizio da definire è GCMListenerService che, come detto in precedenza, è quello dal quale recupereremo i messaggi inviati da GCM e li mostreremo all'utente tramite una notifica.



    Il metodo onMessageReceived() viene richiamato ogni qualvolta il BroadcastReceiver GcmReceiver intercetta un messaggio inviato da GCM. Sarà dunque in questo metodo che saranno eseguite le elaborazioni desiderate sui messaggi ricevuti, tenendo a mente che il parametro stringa "from" contiene il Sender ID mentre "data" i dati inviati dal nostro server.

    Per concludere l'implementazione client non resta che avviare il servizio RegistrationIntentService dall'Activity desiderata.

    Ultima modifica di Crotan; 21-10-15 alle 12:48

  2.  
  3. #2
    Androidiani Power User L'avatar di Crotan


    Registrato dal
    Jul 2013
    Località
    Roma
    Messaggi
    1,265
    Smartphone
    Redmi Note 9 Pro

    Ringraziamenti
    401
    Ringraziato 1,445 volte in 626 Posts
    Predefinito

    Implementazione lato server
    Per l'implementazione lato server utilizzerò il linguaggio di scripting PHP assieme al RDBMS MySQL e come host Altervista. Naturalmente, è possibile sostituire le soluzioni da me impiegate con, rispettivamente: un qualsiasi linguaggio di programmazione lato server, un qualsiasi sistema per la gestione di database e un qualsiasi host web.

    Il primo passo da fare è creare una tabella che conterrà gli ID di registrazione inviati dall'applicazione.

    codice:
    CREATE TABLE IF NOT EXISTS `gcm` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `register_id` varchar(250) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
    Una volta eseguito il codice SQL soprastante da una finestra di query la tabella sarà pronta per essere usata. Lascio al lettore il dovere di creare un apposito script che si occuperà della connessione con MySQL e con il database. In aggiunta, dovrete creare anche un altro script che riceverà l'ID dall'applicazione e lo inserirà nella tabella.

    A seguire, scaricate la classe GCMPushMessage ed inseritela nel vostro spazio web. GCMPushMessage è uno script PHP creato da Matt Grundy e permette di inviare messaggi dal vostro server web a GCM in modo semplice, rapido ed efficace utilizzando il linguaggio Curl. Per inviare un messaggio sarà sufficiente passare allo script la Server API Key, gli ID GCM a cui si vuole inviare il messaggio (memorizzati nella tabella gcm del vostro database) ed il contenuto che si vuole trasmettere.

    Nella pratica, in uno script PHP basterà fare quanto sopra esposto.

    Codice PHP:
    include('GCMPushMessage.php');

    $message "Messaggio da inviare";
    $apiKey "vostra_api_key";
    $devices = array();

    $getDevices mysql_query("SELECT * FROM gcm");
    while(
    $row mysql_fetch_array($getDevices)) {
        
    array_push($devices$row['register_id']);
    }

    $an = new GCMPushMessage($apiKey);
    $an->setDevices($devices);
    $response $an->send($message); 
    In questo modo verrà richiamato il metodo onMessageReceived() insito nel servizio GCMListenerService definito nell'applicazione ed otterrete così il messaggio contenuto in $message. In GCMPushMessage la variabile in questione viene inserita all'interno di un array con ID associativo "message", ragion per cui da Java, sul client, dal Bundle data abbiamo estrapolato la stringa con tale identificativo per ottenere il messaggio inviato dal server. Per esigenze particolari, se avete la necessità di dover passare più di un parametro al metodo send() dovrete intervenire direttamente nella sua dichiarazione nella classe GCMPushMessage.

    Per verificare l'esito dell'operazione di invio potete stampare a video il contenuto della variabile $response attraverso l'istruzione echo. Il suo contenuto è composto da cinque parametri: multicast_id, success, failure, canonical_ids e results. Per ulteriori informazione riguardo ai loro significati consultare la documentazione ufficiale sotto la voce "Table 5. Downstream HTTP message response body (JSON)".

    Nota: Se il messaggio è stato inviato ma il dispositivo Android che deve riceverlo è offline lo riceverà appena si riconnette alla rete internet.

    Avvertimenti
    Se i messaggi che inviate superano i 4096 bytes (4 kB) il messaggio non verrà inviato ed otterrete l'errore MessageTooBig. Prestate dunque attenzione a questo possibile inconveniente. Per ulteriori informazioni riguardo ai possibili errori che restituisce GCM fate riferimento alla documentazione ufficiale sotto la voce "Table 9. Downstream message error response codes".

    Sembrerebbe che ci sia un limite per le richieste inviabili dai server GCM agli ID dei dispositivi. Il numero dovrebbe ammontare a 1000 unità tuttavia non sono sicuro di quanto dico. Se così fosse, e si hanno più di 1000 ID registrati, è sufficiente eseguire più richieste, di 1000 in 1000. Fonte: http://stackoverflow.com/questions/1...to-all-devices, https://www.quora.com/What-is-the-li...loud-Messaging, http://stackoverflow.com/questions/1...ny-daily-limit.

    Per qualsiasi altra informazione inerente l'implementazione ed il funzionamento di Google Cloud Messaging consultare la guida ufficiale fornita da Google.
    Ultima modifica di Crotan; 23-10-15 alle 14:45

  4. #3
    Androidiani Power User L'avatar di Crotan


    Registrato dal
    Jul 2013
    Località
    Roma
    Messaggi
    1,265
    Smartphone
    Redmi Note 9 Pro

    Ringraziamenti
    401
    Ringraziato 1,445 volte in 626 Posts
    Predefinito

    Riservato per future evenienze.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire risposte
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Torna su
Privacy Policy