Вы находитесь на странице: 1из 48

Introduo ao Google Cloud Messaging

Edilson Mendes Bizerra Junior edilsonmendes@gmail.com edilsonmendes.blogspot.com @edilsonmendess

Edilson Mendes
Mestre em Engenharia da Computao pela Universidade de Pernambuco Engenheiro de Sistemas do Centro de Estudos e Sistema Avanados do Recife (C.E.S.A.R) desde 2005 Professor de Android da Faculdade de Filosofia Cincias e Letras de Caruaru (FAFICA)

Agenda
Motivao Pulling vs Pushing Google Cloud Messaging (GCM) Principais Caractersticas Funcionamento A requisio e a resposta GCM na Prtica Habilitando o GCM Instalando as Helper Libraries A Aplicao Cliente A Aplicao Servidora

Motivao
Uso de internet nos smartphones cresce a cada dia

Considerando uma aplicao cliente (android)/servidor (aplicao web qualquer)


Exemplos: Sistema de notcias, placar de futebol, divulgao de propagandas, avisos em geral, etc. Como manter os dados do cliente sempre atualizados?

E se quisermos enviar uma mensagem para algum(uns) cliente(s)?

Existem duas tcnicas bsicas que podemos utilizar: Pulling e Pushing

Pulling
Simples de Implementar Aparelho consulta de tempos e tempos o servidor a fim de obter dados atualizados

Mas...
Conexo Wifi e 3G drenam

sua bateria
em poucas horas A

autonomia
da bateria dos smartphones

no boa

S para se ter uma idia...


Fazer requisies a cada 5 minutos pode consumir aproximadamente 10% da sua bateria por dia

Pode parecer pouco, mas um absurdo para uma nica aplicao

Alm disso...
No sabemos se teremos novas informaes, tentamos cegamente

Atraso
Notificao usando pulling sempre ter um atraso

Aumentar ou diminuir o tempo entre as requisies?


Camos ento no problema Eficincia X Dados Sincronizados

Com o pulling consumimos mais dados


Os planos de dados no Brasil so caros e no prestam!

Trfico no lado do servidor

Cada dispositivo, a cada n minutos bombardeando o Servidor

Pushing
O servidor notifica o cliente quando tiver novos dados Apenas usa rede (e bateria) quando necessrio

Como implementar? SMS? Conexo permanente? Google Cloud Messaging?

SMS
Pode ser muito caro Simples de implementar muito fcil interceptar um SMS no Android
Poucos servios de envio de SMS de graa Muito deles possuem algum tipo de limitao (quantidade de mensagens ou localizao) Lembre-se, pessoas de todo o mundo podem baixar sua aplicao do Google Play Necessidade de contratar um servio pago de envio de SMS

Informaes em tempo-real

Conexo Permanente
O ideal era que essa responsabilidade no fosse da aplicao Exemplo: Banco de Dados Difcil de implementar (no cliente e servidor)
Algumas preocupaes: identificar e diferenciar os aparelhos, entrega de mensagem, e se o aparelho estiver desligado?

Google Cloud Messaging (GCM) for Android um servio

gratuito que ajuda os desenvolvedores a enviar dados de aplicativos no servidor para aplicaes Android.

O GCM trata todos os

aspectos de fila e entrega

de mensagens

Principais caractersticas
Dois tipos de mensagens: Send-to-Sync ou Mensagens com payload (limite de 4kb) GCM no garante a ordem e entrega da mensagem

Um aplicativo Android no precisa estar em execuo para receber mensagens

GCM no faz tratamento nos dados ou fornece inteface grfica

Principais caractersticas
Usa a mesma conexo dos servios do Google (Gmail, Contatos, etc). Requer Android 2.2+ com o Google Play Store, ou um emulador com Android 2.2+ com Google APIs.

necessria uma conta do Google no dispositivo se o Android for inferior ao 4.0.4.

Continuao do Cloud to Device Messaging (C2DM)

Funcionamento
Android Application Google Cloud Messaging Server Application

GCM

5 6

GCM

A aplicao Android, GCM e aplicao servidora precisam se conhecer entre si

Credenciais

https://android.googleapis.com/gcm/send
Google Cloud Messaging

GCM

Registration ID
Android Application

Project Number API Key


Server Application

Registro da Aplicao Android


Google Cloud Messaging

GCM

ct e j ID Pro ber n o i m at r t Nu s gi Re
Android Application Server Application

Registration ID

Envio de Dados
Google Cloud Messaging

GCM

em g a ns e M
Android Application

HT AP T P Da I Ke Post (ht dos y + con Re t e ap tps:/ g I ndo is. /an Ds co d + m/ roi Re gc d.g sp m/ os ta se oogl nd e )
Server Application

Busca novos dados

A Requisio
Para enviar uma mensagem o servidor deve realizar uma requisio HTTP POST para https://android.googleapis.com/gcm/send. Duas formas de criar a requisio e a resposta: Plain Text (limitado, no suporta multicast message) JSON

Formato da Requisio (JSON)


A requisio necessita dos seguintes cabealhos HTTP
Authorization: key=YOUR_API_KEY Content-Type: application/json

O corpo HTTP deve conter uma string representando um objeto JSON com os seguintes campos:
registration_ids, data, collapse_key, etc

Exemplo
Content-Type:application/json Authorization:key=AIzaSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA

{ "registration_ids" : ["APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx..."], "data": { "score": "5x1", "time": "15:10" }, }

Array de Strings com os registration IDs dos dispositivos (pelo menos 1 e no mximo 1000) que recebero a mensagem

{ "collapse_key": "score_update", "time_to_live": 108, "delay_while_idle": true, "data": { "score": "4x8", "time": "15:16.2342" }, "registration_ids":["4", "8", "15", "16", "23", "42"] }

Descarta mensagens sobre o mesmo tema, armazenadas enquanto o dispositivo estava offline, enviando apenas a mais recente O GCM permite no mximo 4 collapse keys ao mesmo tempo
{ "collapse_key": "score_update", "time_to_live": 108, "delay_while_idle": true, "data": { "score": "4x8", "time": "15:16.2342" }, "registration_ids":["4", "8", "15", "16", "23", "42"] }

Objeto JSON cujos campos so os pares chave-valor com dados da mensagem. No h limite para o nmero de pares chave-valor (o tamanho total da mensagem < 4kb)
{ "collapse_key": "score_update", "time_to_live": 108, "delay_while_idle": true, "data": { "score": "4x8", "time": "15:16.2342" }, "registration_ids":["4", "8", "15", "16", "23", "42"] }

Tempo (padro so 4 semanas), em segundos, que a mensagem mantida no GCM enquanto o dispositivo est offline Limite de 100 mensagens, aps isso as mensagens armazenadas so descartadas e quando o dispositivo estiver online recebe uma mensagem especial informando o nmero de mensagens descartadas

{ "collapse_key": "score_update", "time_to_live": 108, "delay_while_idle": true, "data": { "score": "4x8", "time": "15:16.2342" }, "registration_ids":["4", "8", "15", "16", "23", "42"] }

Se definido para true (padro false), indica que a mensagem no deve ser enviada imediatamente se o dispositivo est em idle.

{ "collapse_key": "score_update", "time_to_live": 108, "delay_while_idle": true, "data": { "score": "4x8", "time": "15:16.2342" }, "registration_ids":["4", "8", "15", "16", "23", "42"] }

A Resposta
{ "multicast_id": 216, "success": 3, "failure": 3, "canonical_ids": 1, "results": [ { "message_id": "1:0408" }, { "error": "Unavailable" }, { "error": "InvalidRegistration" }, { "message_id": "1:1516" }, { "message_id": "1:2342", "registration_id": "32" }, { "error": "NotRegistered"} ] }

GCM na prtica

Habilitando o GCM
1. Acessar o Google APIs Console (https://code.google.com/apis/console) e criar um novo projeto.

2. No primeiro acesso aparecer a pgina acima, clique em Create Project...

Habilitando o GCM
4. Sua URL ir mudar para algo como: https://code.google.com/apis/console/#project:4815162342 5. Em seguida, clique em Services no painel esquerdo e habilite o Google Cloud Messaging for Android.

Gerando a API Key


1. Acesse API Access e clique em Create new Server Key... Ou Create new Browser key... para gerar a API key. A API key usada para fazer requisies ao servidor GCM

Instalando as Helper Libraries


1. Abra o SDK Manager e na se instale o Google Cloud Messaging for Android Library na seo Extras

2. Aps a instalao, sero criados os arquivos gcm-client/dist /gcm.jar e gcm-server/dist/gcm-server.jar dentro da pasta YOUR_SDK_ROOT/extras/google/gcm

A Aplicao Cliente (AndroidManifest.xml)


<permission android:name="my_app_package.permission.C2D_MESSAGE" android:protectionLevel="signature" /> <uses-permission android:name="my_app_package.permission.C2D_MESSAGE" />

<!-- App receives GCM messages. --> <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> <!-- GCM connects to Google Services. --> <uses-permission android:name="android.permission.INTERNET" /> <!-- GCM requires a Google account. --> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <!-- Keeps the processor from sleeping when a message is received. --> <uses-permission android:name="android.permission.WAKE_LOCK" />

A Aplicao Cliente (AndroidManifest.xml)


<receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" > <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> <action android:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="my_app_package" /> </intent-filter> </receiver>

<service android:name=".GCMIntentService" />

A Aplicao Cliente (GCMIntentService )


import com.google.android.gcm.GCMBaseIntentService; public class GCMIntentService extends GCMBaseIntentService { private static final String PROJECT_ID = "337954533874"; public GCMIntentService() { super(PROJECT_ID); }

Adicionar no classpath SDK_ROOT/extras/google/gcm/ gcm-client/dist/gcm.jar

protected void onRegistered(Context ctx, String regId) {} protected void onUnregistered(Context ctx, String regId) {} protected void onMessage(Context ctx, Intent intent) { String score = intent.getStringExtra("score"); } protected void onDeletedMessages(Context ctx, int total) {} public void onError(Context ctx, String errorId) {} protected boolean onRecoverableError(Context ctx, String errorId) {} }

A Aplicao Cliente (Activity)


import com.google.android.gcm.GCMRegistrar;

final String regId = GCMRegistrar.getRegistrationId(this); if (regId.equals("")) { GCMRegistrar.register(this, PROJECT_ID); } else { Log.v(TAG, "Already registered"); }

A Aplicao Servidora (Envio)


import com.google.android.gcm.server.*; List<String> devices = new ArrayList<String>(); devices.add("4"); // ... Adicionar no classpath devices.add("43"); (SDK_ROOT/extras/google /gcm) gcmSender sender = new Sender(API_KEY); server/dist/gcmMessage message = new Message.Builder() server.jar .collapseKey("score_update") .timeToLive(108) .delayWhileIdle(true) .addData("score", "4x8") .addData("time", "15:16.2342") .build(); e gcmserver/lib/json_simple1.1.jar

MulticastResult result = sender.send(message, devices, 1);

A Aplicao Servidora (Resposta)


MulticastResult multicastResult = sender.send(message, devices, 1); multicastResult.getCanonicalIds(); multicastResult.getFailure(); multicastResult.getSuccess(); multicastResult.getMulticastId(); multicastResult.getTotal(); for (Result result : multicastResult.getResults()) { if (result.getMessageId() != null) { String canonicalRegId = result.getCanonicalRegistrationId(); if (canonicalRegId != null) { // same device has more than on registration ID: update // database } } else { String error = result.getErrorCodeName(); if (error.equals(Constants.ERROR_NOT_REGISTERED)) { // application has been removed from device - unregister // database } } }

Dvidas

Referncias
http://developer.android.com/guide/google/g cm/index.html http://www.androidhive.info/2012/10/androi d-push-notifications-using-google-cloudmessaging-gcm-php-and-mysql/ http://www.slideshare.net/johannilsson/fosssthlm-android-cloud-to-device-messaging

Obrigado!!!
Edilson Mendes Bizerra Junior edilsonmendes@gmail.com edilsonmendes.blogspot.com @edilsonmendess

Вам также может понравиться