GCM GOOGLE CLOUD MESSAGING By +Dennis Geurts / @dennisgggg
ABOUT ME +Dennis Geurts Software Architect at Luminis Co-organizer Dutch Android User Group
LUMINIS 120+ skilled colleages software and interaction design Arnhem, Apeldoorn, Rotterdam,...
DUTCH AUG +Johan Pelgrim, +Wiebe Elsinga, +Hugo Visser and me Started november 2011 Foundation since feb 2013 GDG since may 2013 Dutch focus, Dutch spread
MAIN SPONSORS
SOCIAL MEDIA WWW.DUTCHAUG.ORG @DutchAUG / #dutchaug +The Dutch Android User Group The Dutch Android User Group
UPCOMING EVENTS June 27th Proguard and Jenkins Amersfoort August? Social meetup Utrecht
OVERVIEW 1. What is GCM 2. Why you should use GCM 3. Third party server role 4. How to use GCM 5. Pitfalls 6. Google I/O 2013 - new features(!)
WHAT IS GCM
GOOGLE CLOUD MESSAGING leverages in-app push notifications queueing and delivery handled by GCM the Android app does not have to be active
GOOGLE CLOUD MESSAGING similar to Apple Push Notification Service multicast message support
GOOGLE CLOUD MESSAGING send payload data send notifications ('send-to-sync') blazingly fast
GOOGLE CLOUD MESSAGING payload maximum 4K message discarded after 4 weeks message can be overwritten [collapsed] delay message delivery
GOOGLE CLOUD MESSAGING STATS...
WHY SHOULD YOU USE GCM PUSH VS PULL APPLICATION FLOW
PUSH VS PULL INSTANT NOTIFICATION POLL FREQUENCY BANDWIDTH USAGE (COSTS) BATTERY USE PULL
PUSH VS PULL POLL FREQUENCY INSTANT NOTIFICATION BANDWIDTH USAGE (COSTS) BATTERY USE PULL
PUSH VS PULL INSTANT NOTIFICATION BANDWIDTH USAGE (COSTS) PUSH BATTERY USE
APPLICATION FLOW SIMPLE LESS CODE MESSAGE DELIVERY NOT GUARANTEED
GCM FLOW
CREATE A GOOGLE API PROJECT
GOOGLE API PROJECT ENABLE GCM SERVICE NOTE THE PROJECT ID NOTE THE API ACCESS KEY
THE THIRD PARTY SERVER
THIRD PARTY SERVER ROLE keep track of registered devices send messages through GCM to registered devices depends upon application's purpose
TRACK REGISTERED DEVICES totally up to the 3rd party developer Android device must notify 3rd party server
INTERACT WITH GCM SERVER HTTP (REST) interface Helper libraries Java Python Node.js...
INTERACT WITH GCM SERVER JAVA GIST //create GCM the message Message msg = new Message.Builder().timeToLive(300).collapseKey("welcome_message");.addData("type", "message").adddata("message", "hello from Mobile Down South").build(); //send GCM the message Sender sender = new Sender(System.getProperty("GCM_KEY")); MulticastResult result = sender.send(msg, regids, 5); //process result...
INTERACT WITH GCM SERVER CHECK SERVER RESPONSE canonical ids are returned for out-dated registration ids
HOW TO USE GCM THE ANDROID SIDE OF IT... supports Froyo [2.2] and up
UPDATE THE MANIFEST... CREATE A PERMISSION <pkg-name>.permission.c2d_message
UPDATE THE MANIFEST... USE SOME PERMISSIONS com.google.android.c2dm.permission.receive <pkg-name>.permission.c2d_message INTERNET GET_ACCOUNTS WAKE_LOCK
CREATE A RECEIVER AND SERVICE... TO PROCESS INCOMING MESSAGES
GOOGLE PROVIDES... GCM.JAR (IN SDK/EXTRAS/GOOGLE/GCM) GCMRegistrar - utility class GCMBroadcastReceiver - complete receiver GCMBaseIntentService - utility service
GCM REGISTRAR to register the device to unregister the device track device registration on 3rd party server
REGISTER YOUR DEVICE Log.i(TAG, "Mainactivity.register()"); if (!GCMRegistrar.isRegistered(this)) { GCMRegistrar.register(this, getresources().getstring(r.string.gcm_sender_id)); } else if (!GCMRegistrar.isRegisteredOnServer(this)) { //custom class ThirdPartyServerApi.register(this); }
GCM BASE INTENT SERVICE onregistered onunregistered onmessage onerror
GCM BASE INTENT SERVICE onregistered(context context, String registrationid) { Log.v("GIS", "onregistered()"); //custom code ThirdPartyServerApi.register(this); } onunregistered(context context, String registrationid) { Log.v("GIS", "onunregistered()"); //custom code ThirdPartyServerApi.unregister(this, registrationid); }
GCM BASE INTENT SERVICE onregistered onunregistered onmessage onerror
ON MESSAGE INTENT EXTRAS contains the payload sent by the 3rd party server
WHAT NEXT? USE THE INTENT DATA TO update internal state fetch data from 3rd party server serve a notification to the user
PITFALLS BOOK KEEPING
BOOK KEEPING track registration ids process canonical ids
GOOGLE I/O 2013 NEW FEATURES!! XMPP device push [to 3rd party server] notifications [to multiple devices]
GOOGLE I/O 2013
GOOGLE I/O 2013 XMPP persistent connection to GCM server asynchronous bi-directional up to 10 connections! ACK / NACK messages
GOOGLE I/O 2013 CONTINUOUS CONNECTION
GOOGLE I/O 2013 DEVICE PUSH (UPSTREAM)
GOOGLE I/O 2013 DEVICE PUSH (UPSTREAM) respond to 3rd party server 'ask' for data no custom HTTP interface required
GOOGLE I/O 2013 GoogleCloudMessaging gcm = GoogleCloudMessaging.get(context); String GCM_SENDER_ID = "Your-Sender-ID"; AtomicInteger msgid = new AtomicInteger(); String id = Integer.toString(msgId.incrementAndGet()); Bundle data = new Bundle(); data.putstring("hello", "Mobile Down South"); // "time to live" parameter int ttl = [0 seconds, 4 weeks] gcm.send(gcm_sender_id+"@gcm.googleapis.com", id, ttl, data);
GOOGLE I/O 2013 NOTIFICATIONS TO MULTIPLE DEVICES e.g. dismiss [Android] notifications
GOOGLE I/O 2013 HELPER LIBRARY available in play services lib backwards compatible to Froyo
GOOGLE I/O 2013 NEW FEATURES XMPP not yet available to the general public...
?? THE END?? QUESTIONS