本地推送通知 UILocalNotification

本地推送通知(UILocalNotification)其实也是通知的一种,系统能在具体的时间触发它,而不用App来触发。本地通知触发后,会显示在通知中心中,并根据配置,显示横幅与声音。本地通知在项目中的运用很有特点,大多都和时间相关。如:备忘录、闹钟(自定义闹钟)、生日提醒等等。文本将讲解如何简单使用本地通知,并在不需要的时候,进行通知移除。

本文Demo下载地址:

https://github.com/saitjr/UILocalNotificationDemo.git


环境信息
Mac OS X 10.10.3
Xcode 6.3
iOS 8.3

正文:

一、创建工程

创建一个SingleViewApplication,并将一个UISwitch控件拖到StoryBoard中,添加居中约束。(添加完以后,注意点击Add 2 Constraints)

二、为UISwitch关联事件

三、给ViewController添加注册/移除本地通知的两个方法


- (void)scheduleLocalNotification {


}

- (void)removeLocalNotification {


}

四、在UISwitch的响应事件中,对两个方法进行调用


- (IBAction)switchTapped:(id)sender {

UISwitch *switcher = (UISwitch *)sender;

if (switcher.on) {

[self scheduleLocalNotification];
return;
}
[self removeLocalNotification];
}

五、注册本地通知


- (void)scheduleLocalNotification {

// 初始化本地通知
UILocalNotification *localNotification = [[UILocalNotification alloc] init];

// 通知触发时间
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:3];
// 触发后,弹出警告框中显示的内容
localNotification.alertBody = @"弹出警告框中显示的内容";
// 触发时的声音(这里选择的系统默认声音)
localNotification.soundName = UILocalNotificationDefaultSoundName;
// 触发频率(repeatInterval是一个枚举值,可以选择每分、每小时、每天、每年等)
localNotification.repeatInterval = NSCalendarUnitDay;
// 需要在App icon上显示的未读通知数(设置为1时,多个通知未读,系统会自动加1,如果不需要显示未读数,这里可以设置0)
localNotification.applicationIconBadgeNumber = 1;
// 设置通知的id,可用于通知移除,也可以传递其他值,当通知触发时可以获取
localNotification.userInfo = @{@"id" : @"notificationId1"};

// 注册本地通知
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
}

六、接收本地通知

当本地通知触发后,需要在AppDelegate中进行接收并做相应处理。在AppDelegate中,实现以下方法:


- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"温馨提示" message:notification.alertBody delegate:nil cancelButtonTitle:@"确认" otherButtonTitles:nil];
[alert show];
}

七、移除本地通知

移除本地通知的方法有两种,一种是全部移除:


[[UIApplication sharedApplication] cancelAllLocalNotifications];

一种是按照id来移除,这个id就是在注册通知时,写的id:


- (void)removeLocalNotification {

// 取出全部本地通知
NSArray *notifications = [UIApplication sharedApplication].scheduledLocalNotifications;
// 设置要移除的通知id
NSString *notificationId = @"notificationId1";

// 遍历进行移除
for (UILocalNotification *localNotification in notifications) {

// 将每个通知的id取出来进行对比
if ([[localNotification.userInfo objectForKey:@"id"] isEqualToString:notificationId]) {

// 移除某一个通知
[[UIApplication sharedApplication] cancelLocalNotification:localNotification];
}
}
}

八、注意事项

  1. 如果需要做一个闹钟或备忘录之类的应用,则将时间作为fireDate,触发之后可以进行移除;
  2. 一个App中,本地通知数量最多64个,不用的通知要及时移除;
  3. 如果通知的时间是后台返回的,那每次需要将通知全部移除,再添加新的。