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/