Skip to main content

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

Html5 based widget for an iOS app: Today extension powered by the Ionic framework

At some point the thought of adding a Widget to my iOS app came to mind which was followed by starting work on adding a widget for my app, My Day Todos . Obviously the first step was to learn how to add a Widget to an iOS app and in that learning process I discovered many things about widgets in iOS first of which was a widget in iOS is a an app extension i.e a  Today Extension . While I am still haven't finished working on the widget for my iOS app, I thought I would take some time out and share what I have learned. In this post, I will share a few important tips and provide an example of how to add a Widget to an iOS app and have the widget UI powered by Html5 via  Ionic framework . I added some code to my Github repo, Html5StarterAppWithSwift in order to show how this can be achieved. There are already too many tutorials out on the Web on how to add a Today extension to an iOS app so I won't be including that here. Instead I will focus on sharing some of the useful tip...

Why can't I cancel a local notification in my iOS app?(in Swift)

Prelude I have mentioned the fact that I am working on my first iOS app in a number of my previous posts and as such I face a number of newbie/noob(?) problems. They are not really problems as much as they are simply things that I do not know, for e.g. the following, how do I get the day of the week? where is my string.replaceAll in Swift? knowing which local notification brought my app to foreground ? serving HTML content in an iOS app that works on iOS 7 and above Thankfully, I have managed to make at least one generic solution and contribute it to the community i.e. my open-source Xcode project template( HTML5StarterAppWithSwift ) which you can get from Github . So this post basically describes another very simple problem that I have found a solution to, but I do not fully understand why the problem was occurring in the first place. Introduction As I have mentioned in this post , my iOS app uses local notifications i.e. UILocalNotification   and i...

App update, discovering Protractor(testing) and an Angularjs State machine

So for the last couple of weeks, I have not be able to update my blog or finish a couple of the posts that I started writing. Well, I have...been a bit busy, with some the following things,  Testing my app I have been using the app( iOS ) on my iPhone for the past couple of months now, which is both good and bad. The good thing is I can test it and the bad thing is, I can use it every day. Part of the reason, I started building this app is to have something that I can and like to use everyday and since I am already using it, the incentive to release it is not as high as if it were something that I could not use. Anyway I did make some good progress over the last couple of weeks, like  Delete the app from my iPhone and do a clean install: this did help me find a few simple bugs that would pop-up when the app is first installed GET AN APP ICON, FINALLY! this was a bit of a hurdle and I thanks to Fiverr  and fivercrazyguy , I finally have my app icon. The day job ...