SlideShare a Scribd company logo
1 of 48
Download to read offline
Introdução ao Google Cloud Messaging
Edilson Mendes Bizerra Junior
edilsonmendes@gmail.com
edilsonmendes.blogspot.com
@edilsonmendess
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)
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
Motivação
   Uso de internet nos smartphones cresce a
                    cada dia
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)?
Existem duas técnicas
básicas 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...
Conexão Wifi e
3G drenam
sua bateria
em poucas
horas
A
autonomia
da bateria dos
smartphones
não é boa
Só para se ter uma idéia...
                      Fazer requisições a cada 5
                      minutos pode consumir
                      aproximadamente 10% da
                      sua bateria por dia


Pode parecer pouco,
mas é um absurdo
para uma única
aplicação
Além disso...

Não sabemos
se teremos
novas
informações,
tentamos
cegamente
Atraso

 Notificação usando pulling sempre
 terá um atraso
Aumentar ou
diminuir o
tempo entre as
requisições?
                 Caímos então no
                 problema Eficiência X
                 Dados Sincronizados
Com o pulling
consumimos
mais dados

Os planos de dados no
Brasil são caros e não
prestam!
Tráfico 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
     Como implementar?        necessário
       • SMS?
       • Conexão permanente?
       • Google Cloud Messaging?
SMS
                            Pode ser muito caro
                             Poucos serviços de envio de SMS de graça
Simples 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 SMS
Informações em
    “tempo-real”
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 de
Exemplo: Banco de Dados     mensagem, e se o aparelho
                            estiver desligado?
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 entrega
de mensagens
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
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.
Funcionamento
Android Application       Google Cloud Messaging        Server Application
                      1          GCM


                                     2
                                                    3



                                                4



                      5
                                            6


                                  GCM
A aplicação Android, GCM e
aplicação servidora precisam se
conhecer entre si
Credenciais


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


                              GCM



                                                 Project Number
 Registration ID                                 API Key
 Android Application                            Server Application
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
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
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
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
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 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"]
}
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"]
}
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"]
}
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"]
}
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"]
}
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 prática
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...
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 requisições ao servidor GCM
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
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" />
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" />
    <action
android:name="com.google.android.c2dm.intent.REGISTRATION" />
   <category android:name="my_app_package" />
 </intent-filter>
</receiver>


<service android:name=".GCMIntentService" />
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) {}

}
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");
 }
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/google
Sender 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);
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
      }
   }
}
Dúvidas
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
Obrigado!!!
Edilson Mendes Bizerra Junior
edilsonmendes@gmail.com
edilsonmendes.blogspot.com
@edilsonmendess

More Related Content

Viewers also liked

Descubra o potencial do seu smartphone Android
Descubra o potencial do seu smartphone AndroidDescubra o potencial do seu smartphone Android
Descubra o potencial do seu smartphone AndroidFlavio Mendes
 
Google Android - WTJatai
Google Android - WTJataiGoogle Android - WTJatai
Google Android - WTJataiCaelum
 
Desenvolvimento de Aplicativos para a Plataforma Android
Desenvolvimento de Aplicativos para a Plataforma AndroidDesenvolvimento de Aplicativos para a Plataforma Android
Desenvolvimento de Aplicativos para a Plataforma AndroidJosé Alexandre Macedo
 
Acessando Banco de Dados com o Android
Acessando Banco de Dados com o AndroidAcessando Banco de Dados com o Android
Acessando Banco de Dados com o AndroidFernando Anselmo
 
Desenvolvimento de aplicações para a plataforma google android
Desenvolvimento de aplicações para a plataforma google androidDesenvolvimento de aplicações para a plataforma google android
Desenvolvimento de aplicações para a plataforma google androidLucas Aquiles
 
Introdução ao Desenvolvimento Android
Introdução ao Desenvolvimento AndroidIntrodução ao Desenvolvimento Android
Introdução ao Desenvolvimento AndroidJosé Alexandre Macedo
 
TDC2014 - Internet das Coisas - Arduino & OpenDevice
TDC2014 - Internet das Coisas - Arduino & OpenDeviceTDC2014 - Internet das Coisas - Arduino & OpenDevice
TDC2014 - Internet das Coisas - Arduino & OpenDeviceRicardo Rufino
 
Consumindo dados via web service no android
Consumindo dados via web service no androidConsumindo dados via web service no android
Consumindo dados via web service no androidAlexandre Antunes
 
Entenda porque seu aplicativo de Android não deve ser igual ao de iPhone
Entenda porque seu aplicativo de Android não deve ser igual ao de iPhoneEntenda porque seu aplicativo de Android não deve ser igual ao de iPhone
Entenda porque seu aplicativo de Android não deve ser igual ao de iPhoneHenrique Perticarati
 

Viewers also liked (10)

Descubra o potencial do seu smartphone Android
Descubra o potencial do seu smartphone AndroidDescubra o potencial do seu smartphone Android
Descubra o potencial do seu smartphone Android
 
Google Android - WTJatai
Google Android - WTJataiGoogle Android - WTJatai
Google Android - WTJatai
 
Desenvolvimento de Aplicativos para a Plataforma Android
Desenvolvimento de Aplicativos para a Plataforma AndroidDesenvolvimento de Aplicativos para a Plataforma Android
Desenvolvimento de Aplicativos para a Plataforma Android
 
Acessando Banco de Dados com o Android
Acessando Banco de Dados com o AndroidAcessando Banco de Dados com o Android
Acessando Banco de Dados com o Android
 
Desenvolvimento de aplicações para a plataforma google android
Desenvolvimento de aplicações para a plataforma google androidDesenvolvimento de aplicações para a plataforma google android
Desenvolvimento de aplicações para a plataforma google android
 
Introdução ao Desenvolvimento Android
Introdução ao Desenvolvimento AndroidIntrodução ao Desenvolvimento Android
Introdução ao Desenvolvimento Android
 
TDC2014 - Internet das Coisas - Arduino & OpenDevice
TDC2014 - Internet das Coisas - Arduino & OpenDeviceTDC2014 - Internet das Coisas - Arduino & OpenDevice
TDC2014 - Internet das Coisas - Arduino & OpenDevice
 
Consumindo dados via web service no android
Consumindo dados via web service no androidConsumindo dados via web service no android
Consumindo dados via web service no android
 
Entenda porque seu aplicativo de Android não deve ser igual ao de iPhone
Entenda porque seu aplicativo de Android não deve ser igual ao de iPhoneEntenda porque seu aplicativo de Android não deve ser igual ao de iPhone
Entenda porque seu aplicativo de Android não deve ser igual ao de iPhone
 
Android ppt
Android ppt Android ppt
Android ppt
 

Similar to Introdução ao Google Cloud Messaging

TDC 2014 - Tudo sobre GCM Push Notifications
TDC 2014 - Tudo sobre GCM Push NotificationsTDC 2014 - Tudo sobre GCM Push Notifications
TDC 2014 - Tudo sobre GCM Push NotificationsSuelen Carvalho
 
MobileConf 2013 GCM
MobileConf 2013 GCM MobileConf 2013 GCM
MobileConf 2013 GCM rlecheta
 
Cloud 2 Device Message Framework - AndroidRec
Cloud 2 Device Message Framework - AndroidRecCloud 2 Device Message Framework - AndroidRec
Cloud 2 Device Message Framework - AndroidRecAntonio Marin Neto
 
Google cloud message
Google cloud messageGoogle cloud message
Google cloud messageJoao Johanes
 
Google cloud messaging
Google cloud messagingGoogle cloud messaging
Google cloud messagingRenan Reis
 
Computação nas nuvens
Computação nas nuvensComputação nas nuvens
Computação nas nuvensRafael Castro
 
Tecnologia GPRS
Tecnologia GPRSTecnologia GPRS
Tecnologia GPRSPlano Bê
 
Serverless no Google Cloud
Serverless no Google CloudServerless no Google Cloud
Serverless no Google CloudLucas Arruda
 
Soluções VAS com Red Hat e JBoss
Soluções VAS com Red Hat e JBossSoluções VAS com Red Hat e JBoss
Soluções VAS com Red Hat e JBossRicardo Ferreira
 
Artigo CONSAD 2012 - Cloud Computing: Questões Críticas Para a Implementação ...
Artigo CONSAD 2012 - Cloud Computing: Questões Críticas Para a Implementação ...Artigo CONSAD 2012 - Cloud Computing: Questões Críticas Para a Implementação ...
Artigo CONSAD 2012 - Cloud Computing: Questões Críticas Para a Implementação ...Marcelo Veloso
 
O que é cloud computing (computação nas nuvens)
O que é cloud computing (computação nas nuvens)O que é cloud computing (computação nas nuvens)
O que é cloud computing (computação nas nuvens)Rohan Bernartt
 
Apresentação cloud computing senac
Apresentação cloud computing senacApresentação cloud computing senac
Apresentação cloud computing senacfrank encarnacão
 
Android Chat Implementation
Android Chat ImplementationAndroid Chat Implementation
Android Chat ImplementationDenis Vieira
 
00 13092011-1430-anderson-germano
00 13092011-1430-anderson-germano00 13092011-1430-anderson-germano
00 13092011-1430-anderson-germanoguiabusinessmedia
 
Transformando a ti com cloud computing e virtualização
Transformando a ti com cloud computing e virtualizaçãoTransformando a ti com cloud computing e virtualização
Transformando a ti com cloud computing e virtualizaçãoDarlan Segalin
 

Similar to Introdução ao Google Cloud Messaging (20)

GCM Android
GCM AndroidGCM Android
GCM Android
 
TDC 2014 - Tudo sobre GCM Push Notifications
TDC 2014 - Tudo sobre GCM Push NotificationsTDC 2014 - Tudo sobre GCM Push Notifications
TDC 2014 - Tudo sobre GCM Push Notifications
 
MobileConf 2013 GCM
MobileConf 2013 GCM MobileConf 2013 GCM
MobileConf 2013 GCM
 
Cloud 2 Device Message Framework - AndroidRec
Cloud 2 Device Message Framework - AndroidRecCloud 2 Device Message Framework - AndroidRec
Cloud 2 Device Message Framework - AndroidRec
 
Google cloud message
Google cloud messageGoogle cloud message
Google cloud message
 
Google cloud messaging
Google cloud messagingGoogle cloud messaging
Google cloud messaging
 
Computação nas nuvens
Computação nas nuvensComputação nas nuvens
Computação nas nuvens
 
Computação nas nuvens
Computação nas nuvensComputação nas nuvens
Computação nas nuvens
 
Tecnologia GPRS
Tecnologia GPRSTecnologia GPRS
Tecnologia GPRS
 
Serverless no Google Cloud
Serverless no Google CloudServerless no Google Cloud
Serverless no Google Cloud
 
Soluções VAS com Red Hat e JBoss
Soluções VAS com Red Hat e JBossSoluções VAS com Red Hat e JBoss
Soluções VAS com Red Hat e JBoss
 
Petic GT4 IR UFS
Petic GT4 IR UFSPetic GT4 IR UFS
Petic GT4 IR UFS
 
Cloud Computing
Cloud ComputingCloud Computing
Cloud Computing
 
Artigo CONSAD 2012 - Cloud Computing: Questões Críticas Para a Implementação ...
Artigo CONSAD 2012 - Cloud Computing: Questões Críticas Para a Implementação ...Artigo CONSAD 2012 - Cloud Computing: Questões Críticas Para a Implementação ...
Artigo CONSAD 2012 - Cloud Computing: Questões Críticas Para a Implementação ...
 
O que é cloud computing (computação nas nuvens)
O que é cloud computing (computação nas nuvens)O que é cloud computing (computação nas nuvens)
O que é cloud computing (computação nas nuvens)
 
Apresentação cloud computing senac
Apresentação cloud computing senacApresentação cloud computing senac
Apresentação cloud computing senac
 
Android Chat Implementation
Android Chat ImplementationAndroid Chat Implementation
Android Chat Implementation
 
Ufs na nuvem gp 2017-2
Ufs na nuvem   gp 2017-2 Ufs na nuvem   gp 2017-2
Ufs na nuvem gp 2017-2
 
00 13092011-1430-anderson-germano
00 13092011-1430-anderson-germano00 13092011-1430-anderson-germano
00 13092011-1430-anderson-germano
 
Transformando a ti com cloud computing e virtualização
Transformando a ti com cloud computing e virtualizaçãoTransformando a ti com cloud computing e virtualização
Transformando a ti com cloud computing e virtualização
 

Introdução ao Google Cloud Messaging

  • 1. Introdução ao Google Cloud Messaging Edilson Mendes Bizerra Junior edilsonmendes@gmail.com edilsonmendes.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écnicas bá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 e 3G drenam sua bateria em poucas horas A autonomia da bateria dos smartphones nã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 dia Pode parecer pouco, mas é um absurdo para uma única aplicação
  • 10. Além disso... Não sabemos se teremos novas informações, tentamos cegamente
  • 11. Atraso Notificação usando pulling sempre terá um atraso
  • 12. Aumentar ou diminuir o tempo entre as requisições? Caímos então no problema Eficiência X Dados Sincronizados
  • 13. Com o pulling consumimos mais dados Os planos de dados no Brasil são caros e não prestam!
  • 14. Tráfico no lado do servidor Cada dispositivo, a cada n minutos bombardeando o Servidor
  • 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ça Simples 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 SMS Informaçõ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 de Exemplo: 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 entrega de 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. Funcionamento Android Application Google Cloud Messaging Server Application 1 GCM 2 3 4 5 6 GCM
  • 22. A aplicação Android, GCM e aplicação servidora precisam se conhecer 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
  • 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"} ] }
  • 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" /> <action android: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/google Sender 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 } } }
  • 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 Junior edilsonmendes@gmail.com edilsonmendes.blogspot.com @edilsonmendess