dispensa12 - GoogleCloudMessaging (1247921 byte)

Transcript

dispensa12 - GoogleCloudMessaging (1247921 byte)
Android
Google Cloud Messaging
Corso di programmazione di sistemi mobile
1
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
2
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
3
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.
Corso di programmazione di sistemi mobile
4
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
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
10
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
11
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
12
<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
13
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
14
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
15
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) {
}
}
Corso di programmazione di sistemi mobile
16