You are on page 1of 9

To demonstrate the usage of local notification, well build a simple To-Do app

together. The app lets users put in any to-do items and preset a reminder. At a
specific time, the app fires up a notification and reminds users about the to-do
item.

Local Notification Demo App


Creating Xcode Project and Design the UI
Okay, lets begin. First, launch Xcode and create a new project using the Single
View Template. Name the project as ToDoApp (or whatever you like). In the
Storyboard, design the user interface similar to the below:

Local Notification Demo Storyboard


The focus of this tutorial is on the implementation of local notifications. So to save
your time from setting up the project and user interface, you can download this
project template to start with.
Tip: If you have no idea about table view and wonder how the navigation bar
works, check out our tutorials in the free iOS course.
Local Notification at a Glance
In general, to setup a location notification, all you need is just a few lines of code:
1 UILocalNotification* localNotification = [[UILocalNotificationalloc] init];
2 localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:60];
3 localNotification.alertBody = @"Your alert message";
4 localNotification.timeZone = [NSTimeZone defaultTimeZone];
5 [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
When you create a local notification, you must specify when the system should
deliver the notification. That is the fireDate property. Optionally, you can set the
time zone. The notification can be displayed as an alert message which is assigned
by using the alertBody property. Once you configure the instance of
UILocalNotification, you schedule it by using the scheduleLocalNotification: of
UIApplicationsharedApplication class.
Lets go back to the app implementation. Well first implement the
AddToDoViewController.m to schedule a notification. The Add To-Do Item view
allows user to add a to-do item and set the time of the reminder using a data
picker. When the save button is tapped, the save: method of
AddToDoViewController will be invoked. Add the following code in the save:
method:
1
2
3
4
5
6
7
8
9
1
0
1

[self.itemText resignFirstResponder];
// Get the current date
NSDate *pickerDate = [self.datePicker date];
// Schedule the notification
UILocalNotification* localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = pickerDate;
localNotification.alertBody = self.itemText.text;
localNotification.alertAction = @"Show me the item";
localNotification.timeZone = [NSTimeZone defaultTimeZone];
localNotification.applicationIconBadgeNumber = [[UIApplication

1
1
2
1
sharedApplication] applicationIconBadgeNumber] + 1;
3
1
[[UIApplication
4
sharedApplication] scheduleLocalNotification:localNotification];
1
5
// Request to reload table view data
1
6
[[NSNotificationCenter defaultCenter] postNotificationName:@"reloadData" obj
1
ect:self];
7
1
// Dismiss the view controller
8
[self dismissViewControllerAnimated:YES completion:nil];
1
9
2
0
The above code is very straightforward. We first hide the on-screen keyboard and
get the preset date from the date picker. Next, we create the local notification with
the date we just retrieve from the date picker. We also set the alert body by using
the to-do item text. Lastly, we increase the existing icon badge number by 1. With
everything configured, we fire up scheduleLocalNotification: method to schedule
the local notification.
Before we end the method, we notify the ToDoListViewController to refresh the
table data.
Displaying a List of Local Notification
In the main screen of the app, we display a list of local notifications that are
scheduled in the table view. Its pretty easy to retrieve the current scheduled local
notification. Simply make the following call and youll get an array of local
notifications:
1 [[UIApplication sharedApplication] scheduledLocalNotifications];
Select the ToDoListViewController.m and change the code for
1 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
2{
3
// Return the number of sections.

return 1;
}
4 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:
5 (NSInteger)section
6{
// Return the number of rows in the section.
7
return [[[UIApplication
8
9 sharedApplication] scheduledLocalNotifications] count];
10 }
11
12 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:
13 (NSIndexPath *)indexPath
14 {
static NSString *CellIdentifier = @"Cell";
15
UITableViewCell *cell = [tableView
16
17 dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
18
19
// Get list of local notifications
20
NSArray *localNotifications = [[UIApplication
21 sharedApplication] scheduledLocalNotifications];
22
UILocalNotification *localNotification = [localNotifications
23 objectAtIndex:indexPath.row];
24
25
// Display notification info
26
[cell.textLabel setText:localNotification.alertBody];
27
[cell.detailTextLabel setText:[localNotification.fireDate description]];
return cell;
}
Ill not go into the details of the code. You should be very familiar with them if you
have an understanding to UITableView implementation.
Okay, lets compile and run the app. Tap the + button in the navigation bar and
add a to-do item. Set the date to a future date. Once done, tap save button to
schedule the notification. As soon as you go back to the table view, youll find the
notification just added. Go back to home screen. Wait for a couple of minutes
(depending on your preset schedule), you should see a notification banner. Or if
youre in lock screen, youll see a notification alert.

Local Notification Demo


Handling Notifications
So far we just create and schedule the notification. But how can we handle the
notification when its fired up?
When a notification is fired up, your app may be either running in the foreground
or background. In the worst case, the app is not running at all. Youll have to
handle these situatios and lets talk about them one by one.
Application is NOT Running

When the app is not running, users see notifications in the


following ways, depending on the notification settings:

Displaying an alert or banner

Badging the app icon

Playing a sound

By tapping on action button of the notification, users will launch the app. In this
case, the application:didFinishLaunchingWithOptions: method of the application
delegate is called.
Change the method to the following code:
- (BOOL)application:(UIApplication *)application
1 didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
2{
// Override point for customization after application launch.
3
4
5
// Handle launching from a notification
6
UILocalNotification *locationNotification = [launchOptions
7 objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
8
if (locationNotification) {
9
// Set icon badge number to zero
10
application.applicationIconBadgeNumber = 0;
11
}
12
13
return YES;
}
In the above code, we use the launchOptions dictionary and see if it contains a
local notification object. For the sake of simplicity, we just reset the icon badge
number when there is a local notification.
Applicaton is Running in Foreground
If the app is running while the notification is delivered, there is no alert displayed
on screen. The application automatically calls its
delegates application:didReceiveLocalNotification: method.
In the AppDelegate.m, add the following method:
1 - (void)application:(UIApplication *)application didReceiveLocalNotification:
2 (UILocalNotification *)notification
3{
4
UIApplicationState state = [application applicationState];
5
if (state == UIApplicationStateActive) {
6
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Reminder"
7
message:notification.alertBody
8
delegate:self cancelButtonTitle:@"OK"
9
otherButtonTitles:nil];
1
[alert show];

0
1
1
}
1
2
// Request to reload table view data
1
3
[[NSNotificationCenter defaultCenter] postNotificationName:@"reloadData" obj
1
ect:self];
4
1
// Set icon badge number to zero
5
application.applicationIconBadgeNumber = 0;
1
}
6
1
7
As well discuss in the following section, the didReceiveLocalNotification: method
will also be called when application is running in background. Here we first
determine the application state and only display an alert when application is
running foreground. We also inform the view controller to reload the table date
and reset the applications icon badge number.

Display an alert while application is running


Application is Running in Background
The app has been launched before but users switch to another app. When the
notification is fired, users normally see an alert banner at the top of the screen.
When its tapped, the app will be brought to the foreground. Similar to the case
that the app is running in foreground, the application automatically calls its
delegates application:didReceiveLocalNotification: method.

Display a location notification as banner