首页 > 代码库 > IOS 本地通知 UILocalNotification
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 //添加推送到UIapplication21 [[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/
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。