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.