IOS 本地通知 UILocalNotification

iOS的本地通知是用到了OC的UILocalNotification对象,加入一个通知很简单,创建一个UILocalNotification对象设置一些对应的参数就行了。

// 添加本地通知

 1 //增加本地推送
 2     NSDate *date = [NSDate dateWithTimeIntervalSinceNow:10];
 3     UILocalNotification *noti = [[UILocalNotification alloc] init];
 4     if (noti) {
 5         //设置时间
 6         noti.fireDate = date;
 7         //设置时区
 8         noti.timeZone = [NSTimeZone defaultTimeZone];
 9         //设置重复间隔
10         noti.repeatInterval = NSWeekdayCalendarUnit;
11         //推送声音
12         noti.soundName = UILocalNotificationDefaultSoundName;//添加声音片段,如@"beijing.caf"
13         //内容
14         noti.alertBody = @"推送内容";
15         //现实在icon上的红色圈中的数字
16         noti.applicationIconBadgeNumber = [[[UIApplication sharedApplication] scheduledLocalNotifications] count ] + 1;
17         //添加userInfo,方便撤销时使用
18         NSDictionary *infoDic = [[NSDictionary alloc] initWithObjectsAndKeys:@"name",@"key", nil];
19         noti.userInfo = infoDic;
20         //添加推送到UIapplication
21         [[UIApplication sharedApplication] scheduleLocalNotification:noti];
22     }

 在非ARC下,创建了就要学会释放。如果不加这一句,通知到时间了,发现顶部通知栏提示的地方有了,然后你通过通知栏进去,然后你发现通知栏里边还有这个提示,除非你手动清除

[notification release];

}

//删除、修改通知

一个右上角提示的问题。你触发了5个通知,后台运行的情况下,3个已经到了,所以你的app右上角此时显示3。那么你通过通知栏或者直接点app进去以后,app右上角应该变为0。按照之前在addNotification里面的设置,等到第4个通知到了以后,app右上角会显示4,第五个到了以后,会显示5,很明显这是不对的。所以我们需要在通过通知栏进去,或者直接点app进去以后,重新去设置第四个第五个通知到了以后,app右上角的数字。
这个重写AppDelegate中的两个方法:didReceiveLocalNotification和applicationDidBecomeActive。
didReceiveLdidReceiveLocalNotification是app在前台运行,通知时间到了,调用的方法。如果程序在后台运行,时间到了以后是不会走这个方法的。
applicationDidBecomeActive是app在后台运行,通知时间到了,你从通知栏进入,或者直接点app图标进入时,会走的方法。ocalNotification和applicationDidBecomeActiv
 
 1 - (void)applicationDidBecomeActive:(UIApplication *)application
 2 {
 3     application.applicationIconBadgeNumber=0;
 4     int count =[[[UIApplication sharedApplication] scheduledLocalNotifications] count];
 5     if(count>0)
 6     {
 7         NSMutableArray *newarry= [NSMutableArray arrayWithCapacity:0];
 8         for (int i=0; i<count; i++)
 9         {
10             UILocalNotification *notif=[[[UIApplication sharedApplication] scheduledLocalNotifications] objectAtIndex:i];
11             notif.applicationIconBadgeNumber=i+1;
12             [newarry addObject:notif];
13         }
14         [[UIApplication sharedApplication] cancelAllLocalNotifications];
15         if (newarry.count>0)
16         {
17             for (int i=0; i<newarry.count; i++)
18             {
19                 UILocalNotification *notif = [newarry objectAtIndex:i];
20                 [[UIApplication sharedApplication] scheduleLocalNotification:notif];
21             }
22         }
23     }
24 }
 
 1 - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
 2 {
 3     UIAlertView *view = [[UIAlertView alloc] initWithTitle:@"接受到本地的通知" message:notification.alertBody delegate:self cancelButtonTitle:@"确定" otherButtonTitles: nil];
 4     [view show];
 5     application.applicationIconBadgeNumber -= 1;
 6     
 7     //3、取消一个本地推送
 8     UIApplication *app = [UIApplication sharedApplication];
 9     //获取本地推送数组
10     NSArray *localArr = [app scheduledLocalNotifications];
11     
12     //声明本地通知对象
13     UILocalNotification *localNoti;
14     
15     if (localArr) {
16         for (UILocalNotification *noti in localArr) {
17             NSDictionary *dict = noti.userInfo;
18             if (dict) {
19                 NSString *inKey = [dict objectForKey:@"key"];
20                 if ([inKey isEqualToString:@"key"]) {
21                     if (localNoti){
22                         localNoti = nil;
23                     }
24                     break;
25                 }
26             }
27         }
28         
29         //判断是否找到已经存在的相同key的推送
30         if (!localNoti) {
31             //不存在 初始化
32             localNoti = [[UILocalNotification alloc] init];
33         }
34         
35         if (localNoti) {
36             //不推送 取消推送
37             [app cancelLocalNotification:localNoti];
38             return;
39         }
40     }
41 }

还有一个问题,本地通知是系统给缓存的,不管应用程序是否在前后台运行,通知都会存在。但我们把应用程序关了再重新运行时,按应用的逻辑,有些通知可能会重复添加,这不是我们想要的结果。所以,比较简单的办法是在程序启动的时候清空所有的本地通知,然后按应用逻辑判断再次重新添加。这个在程序首次起动回调函didFinishLaunchingWithOptions中加一个清空通知和重设应用提示数字了

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    // about notification
application.applicationIconBadgeNumber = 0;
[[UIApplication sharedApplication] cancelAllLocalNotifications];

   return YES;
}

当然,还有一种解决办法是每次添加时判断ID是否已存在,如果存在删了重加。个人觉得这个是一个比较蛋疼的方法,还不如程序起动时清空之后再来重加的好。。
 
参考与:http://zengwu3915.blog.163.com/blog/static/27834897201392895626868/
原文地址:https://www.cnblogs.com/xiaochaozi/p/3848908.html