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

Upload to AWS S3 from Java API

In this post, you will see code samples for how to upload a file to AWS S3 bucket from a Java Spring Boot app. The code you will see here is from one of my open-source repositories on Github, called document-sharing. Problem Let’s say you are building a document sharing app where you allow your users to upload the file to a public cloud solution. Now, let’s say you are building the API for your app with Spring Boot and you are using AWS S3 as your public cloud solution. How would you do that? This blog post contains the code that can help you achieve that. Read more below,  Upload to AWS S3 bucket from Java Spring Boot app - My Day To-Do (mydaytodo.com)

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

The ability to know what the weather is like while planning your day is a feature of  My Day To-Do  Pro and as of the last update it’s also a part of the  Lite version . Unlike the Pro version it’s an auto-renewing subscription based  in-app purchase (IAP)  in the Lite version. What means is that when a user purchases it, the user only pays for the subscription duration after which the user will be automatically charged for the next period. Adding an  auto-renewing  subscription based IAP proved to be somewhat challenging in terms of the app store review i.e. the app update was rejected by the App Review team thrice because of missing information about the IAP. Therefore in this post I will share my experiences and knowledge of adding auto-renewing IAP in hopes to save someone else the time that I had to spend on this problem. In-App purchase This year I started adding IAPs to My Day To-Do Lite which lead to learning about different types of IAP...

Serving HTML content in an iOS app that works in iOS 7 and later (using Swift)

As I have mentioned in an earlier post , I really enjoying coding in Swift. Now what am I doing with it? Well I am trying to build an HTML5 app that must work on devices with iOS 7. So in iOS8 apple has introduced a whole bunch of features that facilitate easy communication between web content and lets just call it back-end Swift code, but those features are not in iOS 7. So why do I want to build something that would work in an older OS? well I do not expect existing iOS users to upgrade to iOS 8 straight away and i also know a couple of people who would be very reluctant to upgrade their iPhones to iOS 8. Now in case you do not, you can have a read of the "Working with WebViews" section of this post , to know how to serve HTML content with WebViews. So when I started building my app, I wanted to know: How do I invoke some Swift code from my HTML content? Well the solution to this may feel a little bit "hacky" but it is a solution to achieve this.  The followi...