Академический Документы
Профессиональный Документы
Культура Документы
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
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
Alm disso...
No sabemos se teremos novas informaes, tentamos cegamente
Atraso
Notificao usando pulling sempre ter um atraso
Pushing
O servidor notifica o cliente quando tiver novos dados Apenas usa rede (e bateria) quando necessrio
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?
gratuito que ajuda os desenvolvedores a enviar dados de aplicativos no servidor para aplicaes Android.
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
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.
Funcionamento
Android Application Google Cloud Messaging Server Application
GCM
5 6
GCM
Credenciais
https://android.googleapis.com/gcm/send
Google Cloud Messaging
GCM
Registration ID
Android Application
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
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
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
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.
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.
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
<!-- 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" />
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) {} }
final String regId = GCMRegistrar.getRegistrationId(this); if (regId.equals("")) { GCMRegistrar.register(this, PROJECT_ID); } else { Log.v(TAG, "Already registered"); }
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