How can I schedule local notification for the following scenario?

Haris Farooqui picture Haris Farooqui · Dec 8, 2012 · Viewed 25.6k times · Source

Experts, I have a scenario wherein I need to notify user three times a day (morning, afternoon, evening). And the timings for these notifications will be different for each day, based on database values for each date.

These three notifications are configurable. Meaning user might just choose to set afternoon and evening while turning off morning notification under settings.

As per my understanding I can achieve this using local notifications.

I can do the following: - before the application exits, inside didFinishLaunchingWithOptions, I can check what is the next notification due, is it set (on/off). If it is set I schedule it. If not I move on to the next notification type and do the same thing. If all the notifications are turned off, obviously, no notifications will be scheduled.

Now when the notification shows up i get to see alert with two buttons "Close" and "View". If user selects "View" My app is back to active and before user exits next notification is scheduled.

So far so good.

Now if user choose to select "Close" What do I do? It wont launch my app and consequently next notification wont be scheduled?

How do I achieve this? Is there any better way to do this?

Help! Help! Help!

Answer

Nate picture Nate · Dec 8, 2012

You can simply schedule all (or many) notifications at one time. You don't need to wait for the user to View your app to schedule the next notification.

From the docs on UILocalNotification,

An application can have only a limited number of scheduled notifications; the system keeps the soonest-firing 64 notifications (with automatically rescheduled notifications counting as a single notification) and discards the rest

So, if you have 3 notifications per day, you can pre-schedule 3 weeks of notifications at once. I suppose you would still have a problem if the user doesn't open your app for a month, but do you need to worry about that scenario?

Anyway, I just wanted to make sure it's clear that you don't need to schedule these notifications one at a time.

Example:

UILocalNotification* n1 = [[UILocalNotification alloc] init];
n1.fireDate = [NSDate dateWithTimeIntervalSinceNow: 60];
n1.alertBody = @"one";
UILocalNotification* n2 = [[UILocalNotification alloc] init];
n2.fireDate = [NSDate dateWithTimeIntervalSinceNow: 90];
n2.alertBody = @"two";
[[UIApplication sharedApplication] scheduleLocalNotification: n1];
[[UIApplication sharedApplication] scheduleLocalNotification: n2];

So, even if the user chooses Close when the first notification appears, the second one will still be delivered.

By the way, the didFinishLaunchingWithOptions method gets called right after your application starts, not right before it closes. That said, you can schedule new notifications whenever you want.