Google Cloud Messaging for Android
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
3,884
On Slideshare
3,575
From Embeds
309
Number of Embeds
13

Actions

Shares
Downloads
76
Comments
0
Likes
9

Embeds 309

http://aljug.blogspot.com.br 116
http://www.aeciocosta.com.br 90
http://edilsonmendes.blogspot.com.br 71
http://aljug.blogspot.ru 9
http://portrait11.slorf.com 7
http://edilsonmendes.blogspot.com 5
https://www.google.com.br 3
http://edilsonmendes.blogspot.ie 2
http://webcache.googleusercontent.com 2
http://aljug.blogspot.com 1
http://alagoas45.rssing.com 1
https://www.linkedin.com 1
http://www.edilsonmendes.blogspot.com.br 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Introdução ao Google Cloud MessagingEdilson Mendes Bizerra Junioredilsonmendes@gmail.comedilsonmendes.blogspot.com@edilsonmendess
  • 2. Edilson Mendes Mestre em Engenharia da Computação pela Universidade de Pernambuco Engenheiro de Sistemas do Centro de Estudos e Sistema Avançados do Recife (C.E.S.A.R) desde 2005 Professor de Android da Faculdade de Filosofia Ciências e Letras de Caruaru (FAFICA)
  • 3. Agenda Motivação Pulling vs Pushing Google Cloud Messaging (GCM) Principais Características Funcionamento A requisição e a resposta GCM na Prática Habilitando o GCM Instalando as Helper Libraries A Aplicação Cliente A Aplicação Servidora
  • 4. Motivação Uso de internet nos smartphones cresce a cada dia
  • 5. Considerando uma aplicação cliente(android)/servidor (aplicação web qualquer)Exemplos: Sistema de notícias, placar de futebol, divulgação de Como manter propagandas, avisos em geral, os dados do etc. cliente sempre atualizados? E se quisermos enviar uma mensagem para algum(uns) cliente(s)?
  • 6. Existem duas técnicasbásicas que podemos utilizar: Pulling e Pushing
  • 7. Pulling Simples de Implementar Aparelho consulta de tempos e tempos o servidor a fim de obter dados atualizados
  • 8. Mas...Conexão Wifi e3G drenamsua bateriaem poucashorasAautonomiada bateria dossmartphonesnão é boa
  • 9. Só para se ter uma idéia... Fazer requisições a cada 5 minutos pode consumir aproximadamente 10% da sua bateria por diaPode parecer pouco,mas é um absurdopara uma únicaaplicação
  • 10. Além disso...Não sabemosse teremosnovasinformações,tentamoscegamente
  • 11. Atraso Notificação usando pulling sempre terá um atraso
  • 12. Aumentar oudiminuir otempo entre asrequisições? Caímos então no problema Eficiência X Dados Sincronizados
  • 13. Com o pullingconsumimosmais dadosOs planos de dados noBrasil são caros e nãoprestam!
  • 14. Tráfico no lado do servidorCada dispositivo, acada n minutosbombardeando oServidor
  • 15. Pushing O servidor notifica o cliente quando tiver novos dados Apenas usa rede (e bateria) quando Como implementar? necessário • SMS? • Conexão permanente? • Google Cloud Messaging?
  • 16. SMS Pode ser muito caro Poucos serviços de envio de SMS de graçaSimples de implementar Muito deles possuem algum tipo deÉ muito fácil interceptar limitação (quantidade de mensagens ou um SMS no Android localização) Lembre-se, pessoas de todo o mundo podem baixar sua aplicação do Google Play Necessidade de contratar um serviço pago de envio de SMSInformações em “tempo-real”
  • 17. Conexão Permanente Difícil de implementar (no cliente e servidor)O ideal era que essa Algumas preocupações: responsabilidade não identificar e diferenciar os fosse da aplicação aparelhos, entrega deExemplo: Banco de Dados mensagem, e se o aparelho estiver desligado?
  • 18. Google Cloud Messaging (GCM) for Android é um serviço gratuito que ajuda os desenvolvedores a enviar dados de aplicativos no servidor para aplicações Android.O GCM trata todos os aspectos de fila e entregade mensagens
  • 19. Principais características Dois tipos de mensagens: Send-to-Sync ou GCM não garante a ordem Mensagens com payload e entrega da mensagem (limite de 4kb) Um aplicativo Android não GCM não faz tratamento precisa estar em execução nos dados ou fornece para receber mensagens inteface gráfica
  • 20. Principais características Requer Android 2.2+ com o Usa a mesma conexão dos Google Play Store, ou um serviços do Google (Gmail, emulador com Android Contatos, etc). 2.2+ com Google APIs. É necessária uma conta do Google no dispositivo se o Continuação do Cloud to Android for inferior ao Device Messaging (C2DM) 4.0.4.
  • 21. FuncionamentoAndroid Application Google Cloud Messaging Server Application 1 GCM 2 3 4 5 6 GCM
  • 22. A aplicação Android, GCM eaplicação servidora precisam seconhecer entre si
  • 23. Credenciais https://android.googleapis.com/gcm/send Google Cloud Messaging GCM Project Number Registration ID API Key Android Application Server Application
  • 24. Registro da Aplicação Android Google Cloud Messaging GCM t jec r ID Pro be ion m t Nu gistra Re Android Application Server Application Registration ID
  • 25. Envio de Dados Google Cloud Messaging HT AP T P Da I Ke Post (ht dos y + con Re t e GCM ap tps:/ g I ndo is. /an Ds co dro + m Re m/ gc id.g age sp os m/ M ens ta se oogl nd e ) Android Application Server Application Busca novos dados
  • 26. A Requisição Para enviar uma mensagem o servidor deve realizar uma requisição HTTP POST para https://android.googleapis.com/gcm/send. Duas formas de criar a requisição e a resposta: Plain Text (limitado, não suporta multicast message) JSON
  • 27. Formato da Requisição (JSON) A requisição necessita dos seguintes cabeçalhos 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
  • 28. ExemploContent-Type:application/jsonAuthorization:key=AIzaSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA{"registration_ids" : ["APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx..."],"data": { "score": "5x1", "time": "15:10" },}
  • 29. Array de Strings com os registration IDs dos dispositivos (pelo menos 1 e no máximo 1000) que receberão 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"]}
  • 30. Descarta mensagens sobre o mesmo tema, armazenadas enquanto o dispositivo estava offline, enviando apenas a mais recente O GCM permite no máximo 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"]}
  • 31. Objeto JSON cujos campos são os pares chave-valor com dados da mensagem. Não há limite para o número 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"]}
  • 32. Tempo (padrão são 4 semanas), em segundos, que a mensagem é mantida no GCM enquanto o dispositivo está offline Limite de 100 mensagens, após isso as mensagens armazenadas são descartadas e quando o dispositivo estiver online recebe uma mensagem especial informando o número 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"]}
  • 33. Se definido para true (padrão é false), indica que a mensagem não 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"]}
  • 34. 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"} ]}
  • 35. GCM na prática
  • 36. 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 página acima, clique em Create Project...
  • 37. 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.
  • 38. 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 requisições ao servidor GCM
  • 39. Instalando as Helper Libraries 1. Abra o SDK Manager e na se instale o Google Cloud Messaging for Android Library na seção Extras 2. Após a instalação, serão criados os arquivos gcm-client/dist /gcm.jar e gcm-server/dist/gcm-server.jar dentro da pasta YOUR_SDK_ROOT/extras/google/gcm
  • 40. A Aplicação 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" />
  • 41. A Aplicação 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" /> <actionandroid:name="com.google.android.c2dm.intent.REGISTRATION" /> <category android:name="my_app_package" /> </intent-filter></receiver><service android:name=".GCMIntentService" />
  • 42. A Aplicação Cliente (GCMIntentService )import com.google.android.gcm.GCMBaseIntentService;public class GCMIntentService extends GCMBaseIntentService { private static final String PROJECT_ID = "337954533874"; public GCMIntentService() { Adicionar no classpath super(PROJECT_ID); 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) {}}
  • 43. A Aplicação 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"); }
  • 44. A Aplicação Servidora (Envio)import com.google.android.gcm.server.*;List<String> devices = new ArrayList<String>();devices.add("4");// ...devices.add("43"); Adicionar no classpath (SDK_ROOT/extras/googleSender sender = new Sender(API_KEY); /gcm) gcm-Message message = new Message.Builder() server/dist/gcm- server.jar.collapseKey("score_update") e.timeToLive(108).delayWhileIdle(true) gcm-.addData("score", "4x8") server/lib/json_simple-.addData("time", "15:16.2342") 1.1.jar.build();MulticastResult result = sender.send(message, devices, 1);
  • 45. A Aplicação 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 } }}
  • 46. Dúvidas
  • 47. Referências • http://developer.android.com/guide/google/g cm/index.html • http://www.androidhive.info/2012/10/androi d-push-notifications-using-google-cloud- messaging-gcm-php-and-mysql/ • http://www.slideshare.net/johannilsson/foss- sthlm-android-cloud-to-device-messaging
  • 48. Obrigado!!!Edilson Mendes Bizerra Junioredilsonmendes@gmail.comedilsonmendes.blogspot.com@edilsonmendess