Knowing which notification caused the iOS app to resume

This was another one of those rather simple problems that took me a while to work out, mainly because of my approach to iOS development. So how am I approaching it? well since I am new to it, I tend to not know a lot of stuff so I generally have lots of problems that I need to solve. So if I get stuck on a problem, I will simply move onto one of the other problems that need to be solved and that I can solve and later, revisit the problem I was originally stuck on. This will allow my iOS knowledge to grow and something that is  not immediately obvious initially, will be so later on.

Problem

I have an iOS app that uses local notifications to create a more engaging user experience. The local notifications fall into one of two distinct categories and when the app resumes via a notification, it performs a set of "app resume/awake" behaviours that are relative to the notification category. Wow, even I would have trouble following what I just wrote, so let me just make this beyond super simple. Ok, here goes,  say I have an app called Animal whose only job is to make a sound and it does so when the user resumes the app via a local notification.  So there are two categories of notifications that a user can get and they are dog and cat.  So if the app resumes via a dog notification it produces the bark sound i.e. woof woof!!! and if it resumes via the cat notification, it must meow!!!. So the app can either bark or meow depending on the notification that causes it to resume.

Solution

There are two problems that need to be solved here,
  1. Problem 1: Setting a category on the notification to identify what category the notification belongs to
  2. Problem 2: Getting access to the notification object that triggered the app to resume so it's category can be identified

Solution to Problem 1

So a localNotification is scheduled using the UILocalNotification object and it has a dictionary called userInfo. UserInfo is basically a dictionary to which you can add whatever you want as long as it conforms to [NSObject:AnyObject], so the information about the notification category can be added there.

So at this point, we know how add the notification category information to the local notification, so we can schedule a notification with the unique category info but how do we extract that category info when the notification triggers the app resume or launch?

Solution to Problem 2

Ok so it took me a bit of time to figure this one out, but I finally have a solution for this. Similar to what I identified in this post, I suppose I just did not know where to look for the answer. Now I do and the answer lies in the UIApplicationDelegate protocol, which has the following optional method

optional func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification)

So just add that method to your app's AppDelegate and that method will be invoked when the app resumes or launches due to a local notification. This gives you access to the scheduled UILocalNotification object so you also have access to the userInfo dictionary of the notification from which you can extract the notification category. So I am not dealing with remote notifications in my app, but like the above method, the app delegate also has a this method

optional func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject])
so we are getting the userInfo with the remote notification as identified from the method above.

Note: I am only talking about the app resuming, which would generally mean that the app was running even if in the background, however the aforementioned method applies, even if the app was not running. When it is not running the notification will simply cause the app to launch.

So what did I learn from the process of solving this problem?

My recommendation to anyone starting iOS development would be to read some informative blogs on iOS development, blogs such as Jameson Quave or Ran Wanderlich. Simultaneously the Apple docs  are a fantastic resource and do a really good job in explaining certain concepts.

Comments

Popular posts from this blog

Upload to AWS S3 from Java API

Addressing app review rejections for auto-renewing subscription in-app purchase (iOS)

Getting started with iOS programming using Swift (Part 1)