Corso di programmazione di sistemi mobile 1 Android Google Cloud Messaging
Corso di programmazione di sistemi mobile 2 Cos è Il Google Cloud Messaging o GCM è un servizio di Google che permette di inviare notifiche o dati da un server di terze parti ai dispositivi Android, ios o Chrome. Tutti gli aspetti dell invio dei dati, della gestione della coda e della consegna sui dispositivi sono gestiti dal GCM stesso. Esso permette agli sviluppatore di creare un esperienza utente eccellente limitando il numero di righe di codice da scrivere e permettendo una migliore gestione dell applicazione e del dispositivo. Perché utilizzare il GCM: API: semplici da utilizzare, non richiedono nessun pagamento e non prevedono limitazioni. Multicasting: un messaggio può essere ricevuto da più dispositivi e da più persone. Upstream: il dispositivo può inviare dei dati dal GCM che a sua volta li inoltrerà al server. Mittenti multipli: più server possono inviare messaggi alla stessa applicazione Archivio: il gcm conserva i messaggi fino 4 settimane Ottimizzazione: il gcm ha come obbiettivo il risparmio energetico mantenendo sempre e comunque il servizio attivo.
Corso di programmazione di sistemi mobile 3 Come funziona L utilizzo del GCM si configura in 4 step: 1. Configurazione del progetto sulla Google Developer Console 2. Preparazione dell ambiente Server per la registrazione dell app e l invio dei messaggi al GCM 3. Registrazione dell app al GCM e invio dei dati al Server 4. Gestione della ricezione dei messaggi da parte del GCM sull app
Corso di programmazione di sistemi mobile 4 Configurazione del GCM Prima di poter utilizzare il GCM all interno della propria app è necessario configurare l app sulla console di Google. Per far questo è necessario recarsi al seguente link https://developers.google.com/mobile/add?platform=android e seguire la procedura guidata.
Nota: Android package name deve corrispondere al package name dell applicazione che utilizzerà il GCM Corso di programmazione di sistemi mobile 5
Selezionare il Cloud Messaging e cliccare su Enable Google Cloud Messaging Corso di programmazione di sistemi mobile 6
Una volta attivato il servizio la console restituirà la Server Api Key e il Sender ID. Corso di programmazione di sistemi mobile 7
È possibile anche scaricare il file contenente le informazioni appena viste. Il file dovrà essere copiato all interno del modulo dell app che utilizzerà il GCM e che avrà il package name indicato nelle pagine precedenti. Corso di programmazione di sistemi mobile 8
Server Sul server di terze parti sarà necessario predisporre un database per salvare gli id dei device e per l invio dei messaggi al server gcm. L invio di un messaggio sarà cosi effettuato: public function send_notification($reg_id, $title, $message, $extra) { $url='https://android.googleapis.com/gcm/send'; $fields = array('registration_ids'=>array($reg_id), 'data'=>array('title'=>$title, 'message'=>$message, 'extra'=>$extra)); $headers = array('authorization:key = YourAuthorizationKey', //server key 'Content-Type: application/json'); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true ); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields)); $result = curl_exec($ch); curl_close($ch); echo $result; Corso di programmazione di sistemi mobile 9
Corso di programmazione di sistemi mobile 10 Android Per utilizzare il GCM all interno di un applicazione android sarà necessario eseguire diverse operazioni. Prima di tutto bisogna modificare il file build.gradle del progetto e aggiungere la seguente riga alle dependencies: 'com.google.gms:google-services:2.1.0-beta3 il file dovrà risultare: buildscript { repositories { jcenter() dependencies { classpath 'com.android.tools.build:gradle:2.0.0' classpath 'com.google.gms:google-services:2.1.0-beta3' allprojects { repositories { jcenter() task clean(type: Delete) { delete rootproject.builddir
Corso di programmazione di sistemi mobile 11 Dopodiché sarà necessario importare il file generato dalla google console contenente le informazioni per il gcm, aggiungere il plugin e la libreria all interno del file build.gradle dell applicazione. apply plugin: 'com.android.application' apply plugin: 'com.google.gms.google-services <= plugin da aggiungere android { compilesdkversion 23 buildtoolsversion "23.0.3" defaultconfig { applicationid "it.test.gcm" minsdkversion 15 targetsdkversion 23 versioncode 1 versionname "1.0" buildtypes { release { minifyenabled false proguardfiles getdefaultproguardfile('proguard-android.txt'), 'proguard-rules.pro' dependencies { compile 'com.android.support:appcompat-v7:23.3.0' compile 'com.google.android.gms:play-services:8.3.0 <= libreria da importare
Corso di programmazione di sistemi mobile 12 Una volta sincronizzato il gradle sarà necessario modificare il manifest inserendo: 1. Un nuovo permesso <application-package-name> + ".permission.c2d_message«2. L utilizzo del permesso sopra dichiarato 3. L utilizzo del permesso WAKE_LOCK Questo farà si che nessun altra applicazione sul dispositivo possa registrarsi e ricevere i messaggi inviati dal gcm alla nostra applicazione. Sarà inoltre necessario all interno del tag application dichiarare: 3. Il receiver "com.google.android.gms.gcm.gcmreceiver" che si occuperà di gestire e smistare i messaggi ricevuti dal gcm 4. Un service che estende "GcmListenerService" che gestirà il messaggio ricevuto da GcmReceiver 5. Un service che estende "InstanceIDListenerService" che gestirà la creazione e l aggiornamento del token di registrazione
Corso di programmazione di sistemi mobile 13 <manifest xmlns:android=http://schemas.android.com/apk/res/android package="it.test.gcm"> <permission android:name="it.test.gcm.permission.c2d_message" android:protectionlevel="signature" /> <uses-permission android:name="it.test.gcm.permission.c2d_message" /> <uses-permission android:name="android.permission.wake_lock" /> <application --- > <receiver android:name="com.google.android.gms.gcm.gcmreceiver" android:exported="true" android:permission="com.google.android.c2dm.permission.send" > <intent-filter> <action android:name="com.google.android.c2dm.intent.registration" /> <action android:name="com.google.android.c2dm.intent.receive" /> <category android:name="it.test.gcm" /> </intent-filter> </receiver> <service android:name=".gcmtestservice" android:exported="false" > <intent-filter> <action android:name="com.google.android.c2dm.intent.receive" /> </intent-filter> </service> <service android:name=".gcmtestidlistener" android:exported="false"> <intent-filter> <action android:name="com.google.android.gms.iid.instanceid" /> </intent-filter> </service> </application> </manifest>
Corso di programmazione di sistemi mobile 14 Ottenere un Token di registrazione Per poter inviare un messaggio ad un dispositivo bisogna che questo prima sia registrato presso il servizio di Google. Il gcm risponderà con il token che identificherà il dispositivo che verrà utilizzato dal server per inviare la push. Il token viene generato tramite le API InstanceID ed è necessario ottenere il token in un thread separato dal main thread, per esempio attraverso l utilizzo di un IntentService. Attaverso la classe InstanceIDListenerService possiamo sapere quando è necessario richiedere un token. public class GcmTestIDListener extends InstanceIDListenerService { @Override public void ontokenrefresh() { startservice(new Intent(this, RegistrationIntentService.class)); RegistrationIntentService è un IntentService che si occuperà di ottenere e salvare il token di registrazione.
Corso di programmazione di sistemi mobile 15 public class RegistrationIntentService extends IntentService { private static final String TAG = "RIService"; public RegistrationIntentService() { super(tag); @Override protected void onhandleintent(intent intent) { String token = ""; try { InstanceID instanceid = InstanceID.getInstance(this); token = instanceid.gettoken(gcmutils.sender_id, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null); Log.i(TAG, "GCM Registration Token: " + token); sendregistrationtoserver(token); catch (Exception e) { Log.d(TAG, "Failed to get Registration Token", e); GcmUtils.saveToken(this, token); sendbroadcast(new Intent(GcmUtils.ACTION_REG_COMPLETED)); private void sendregistrationtoserver(string token) {
Corso di programmazione di sistemi mobile 16 Una volta completata la registrazione e salvato il token sul server l applicazione sarà pronta per ricevere i messaggi. Ogni volta che il dispositivo riceve un messaggio dal Gcm viene inviato all oggetto GcmListenerService che si occuperà della lettura e gestione delle informazioni presenti all interno del messaggio. public class GcmTestService extends GcmListenerService { private static final String TAG = "GcmTestService"; @Override public void onmessagereceived(string from, Bundle data) { String message = data.getstring("message"); Log.d(TAG, "From: " + from); Log.d(TAG, "Message: " + message); sendnotification(message); private void sendnotification(string message) {