Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Set Course for Notifications… Engage! (DevFest DC)

Eric Fung
September 24, 2016

Set Course for Notifications… Engage! (DevFest DC)

With only a minimum of coding, Firebase provides your Android app with simple push notifications and collects analytics to measure user engagement. However, if you need to customize the notifications or their behavior, you need to implement everything yourself. For a recent Android news app I developed, I wanted to use push messaging to inform users when new articles were published. This talk will describe how I used three Firebase tools (Notifications, Cloud Messaging, and Analytics) to implement custom notifications and analytics to track their performance.

This was presented at DevFest DC on 2016-09-24. It is a revised version of the one I presented in Toronto.

Video: https://www.youtube.com/watch?v=N31imAjtuAQ

Eric Fung

September 24, 2016
Tweet

More Decks by Eric Fung

Other Decks in Programming

Transcript

  1. What You Get → Manifest permissions → Registration token →

    Broadcast receiver → Display in notification area → Topic subscription → Analytics
  2. What About… → Different notification style? → Grouping and summary?

    → Not showing until background sync happens? → Analytics and reporting?
  3. Notification Messages { "to" : "/topics/email_marketing", "notification" : { "body"

    : "How to Grow a Business with Email Marketing", "title" : "New article available", } } → Predefined keys → Shown automatically if app backgrounded → Console only sends this type
  4. Data Messages { "to" : "/topics/email_marketing", "data" : { "item_id"

    : 14142135, "article_title" : "How to Grow a Business with Email Marketing" } } → Freeform keys and values → App decides what to do on receive → Console cannot send this kind
  5. Sending Data Messages → Must use FCM → Handle everything

    in onMessageReceived → No more analytics → Or funnel analysis
  6. Grouping Notifications private static final String GROUP_NEW_ARTICLE = "new_article"; new

    NotificationCompat.Builder(context) .setContentTitle(title[0]) .setGroup(GROUP_NEW_ARTICLE) // ⾢⾢⾢⾢⾢ … new NotificationCompat.Builder(context) .setContentTitle(title[1]) .setGroup(GROUP_NEW_ARTICLE) // ⾢⾢⾢⾢⾢ …
  7. Summary Notification new NotificationCompat.Builder(context) .setContentTitle(n + " new articles") .setStyle(inboxStyle)

    .setGroup(GROUP_NEW_ARTICLE) // ⾢⾢⾢⾢⾢ .setGroupSummary(true) // ⾢⾢⾢⾢⾢ …
  8. When Not To Show → During "Do Not Disturb" time

    → Push data needs further processing → Send-to-sync messages
  9. Being a Good App Citizen → Push messages are delivered

    very quickly → Consider server when client syncs → Stagger start time of sync → Minimize power usage
  10. Jobs in GCMNetworkManager → Specify network and scheduling requirements →

    Scheduler tries to batch and defer as long as possible
  11. MyFirebaseMessagingService.java @Override public void onMessageReceived(RemoteMessage remoteMessage) { Map<String, String> data

    = remoteMessage.getData(); long articleId = parseIdFromData(data); // TBD: Remember we have a pending notification scheduleArticleFetch(rng.nextInt(SYNC_MIN) + 1, SYNC_MAX); }
  12. MyGcmTaskService.java @Override public int onRunTask(TaskParams taskParams) { Bundle extras =

    taskParams.getExtras(); apiService.fetchLatest(…); // TBD: Alert observers that sync has completed, // then showing any notifications that were pending }
  13. Detect Foreground or Background Ordered Broadcast https://commonsware.com/blog/2010/08/11/activity- notification-ordered-broadcast.html Application and

    ActivityLifecycleCallbacks http://www.developerphil.com/no-you-can-not-override-the- home-button-but-you-dont-have-to/
  14. notif_receive, notif_foreground @Override public void onMessageReceived(RemoteMessage remoteMessage) { boolean isBackground

    = ((MyApp)getApplication()).isBackground(); firebaseAnalytics.logEvent(isBackground ? "notif_receive" : "notif_foreground", params); … }
  15. notif_receive, notif_foreground @Override public void onMessageReceived(RemoteMessage remoteMessage) { // TBD:

    Extract any extra data and record in event, e.g. item ID boolean isBackground = ((MyApp)getApplication()).isBackground(); firebaseAnalytics.logEvent(isBackground ? "notif_receive" : "notif_foreground", params); … }
  16. Opening Notification Intent serviceIntent = new Intent(NotificationActionService.ACTION_TAPPED, null, context, NotificationActionService.class);

    … Intent intent = PendingIntent.getService(context.getApplicationContext(), REQUEST_CODE_TAPPED, serviceIntent, PendingIntent.FLAG_UPDATE_CURRENT); NotificationCompat.Builder builder = new NotificationCompat.Builder(context) .setContentIntent(intent) …
  17. NotificationActionService.java public class NotificationActionService extends IntentService { @Override protected void

    onHandleIntent(Intent intent) { switch (intent.getAction()) { case ACTION_TAPPED: firebaseAnalytics.logEvent("notif_open", params); case ACTION_DISMISSED: firebaseAnalytics.logEvent("notif_dismiss", params); } } }
  18. Analytics Limitations → Can't filter analytics by event parameters ✳

    → Need parameters for per-notification funnel analysis → Parameters can be specified in Audiences
  19. ! Segment by Item ID → Users who received a

    notification AND, → Opened the notification, OR, dismissed it
  20. Beyond Analytics → Filtering on event parameters is a popular

    feature request → Can stream raw events + parameters into BigQuery
  21. Topic Messaging → Useful if you don't need to address

    individually → Topics don't have to be pre-defined → For simple messaging, subscribe all clients to one topic firebase.subscribeToTopic("all_new_articles");
  22. Sending Notifications to FCM → Don't need to integrate into

    your backend → Anything that can send an HTTP request → Example using cURL in the Gist → Shell script useful for debugging
  23. Support Stack Overflow, Google Group, Report Bug/Feature Request https://firebase.google.com/support/ Status

    Page https://status.firebase.google.com/ Firebase Slack https://firebase-community.appspot.com/
  24. Takeaway → Firebase Notifications gives you a basic implementation →

    For more complex needs, get to know FCM → For me, no reduction in lines of code → Lot of manual work to produce analytics
  25. Let's have some questions! Email [email protected] Work www.shopify.com Blog code.gnufmuffin.com

    Code github.com/efung Social @gnufmuffin Slides speakerdeck.com/efung