永发信息网

ios uilocalnotification 多个本地通知,怎么有区分的删除

答案:1  悬赏:40  手机版
解决时间 2021-04-02 04:33
ios uilocalnotification 多个本地通知,怎么有区分的删除
最佳答案
iOS的本地通知是用到了OC的UILocalNotification对象,加入一个通知很简单,创建一个UILocalNotification对象设置一些对应的参数就行了。
  // 添加本地通知
  UILocalNotification *notification=[[UILocalNotification alloc] init];
if (notification!=nil)
  {
NSDate *now = [NSDate date];
  // 设置提醒时间,倒计时以秒为单位。以下是从现在开始55秒以后通知
notification.fireDate=[now dateByAddingTimeInterval:55];
  // 设置时区,使用本地时区
notification.timeZone=[NSTimeZone defaultTimeZone];
  // 设置提示的文字
notification.alertBody=@"时间到了,洗洗睡吧";
  // 设置提示音,使用默认的
notification.soundName= UILocalNotificationDefaultSoundName;
  // 锁屏后提示文字,一般来说,都会设置与alertBody一样
notification.alertAction=NSLocalizedString(@"锁屏了,洗洗睡吧", nil);
  // 这个通知到时间时,你的应用程序右上角显示的数字. 获取当前的数字+1
  notification.applicationIconBadgeNumber = [[[UIApplication sharedApplication] scheduledLocalNotifications] count]+1;
//给这个通知增加key 便于半路取消。nfkey这个key是自己随便写的,还有notificationtag也是自己定义的ID。假如你的通知不会在还没到时间的时候手动取消,那下面的两行代码你可以不用写了。取消通知的时候判断key和ID相同的就是同一个通知了。
  NSDictionary *dict =[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:notificationtag],@"nfkey",nil];
[notification setUserInfo:dict];
  // 启用这个通知
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
// 创建了就要学会释放。如果不加这一句,通知到时间了,发现顶部通知栏提示的地方有了,然后你通过通知栏进去,然后你发现通知栏里边还有这个提示,除非你手动清除
  [notification release];
  }
  // 手动删除通知
  // 这里我们要根据我们添加时设置的key和自定义的ID来删
  NSArray *narry=[[UIApplication sharedApplication] scheduledLocalNotifications];
NSUInteger acount=[narry count];
if (acount>0)
  {
  // 遍历找到对应nfkey和notificationtag的通知
for (int i=0; i  {
UILocalNotification *myUILocalNotification = [narry objectAtIndex:i];
NSDictionary *userInfo = myUILocalNotification.userInfo;
NSNumber *obj = [userInfo objectForKey:@"nfkey"];
int mytag=[obj intValue];
if (mytag==notificationtag)
  {
  // 删除本地通知
[[UIApplication sharedApplication] cancelLocalNotification:myUILocalNotification];
break;
}
}
}

  一个右上角提示的问题。你触发了5个通知,后台运行的情况下,3个已经到了,所以你的app右上角此时显示3。那么你通过通知栏或者直接点app进去以后,app右上角应该变为0。按照之前在addNotification里面的设置,等到第4个通知到了以后,app右上角会显示4,第五个到了以后,会显示5,很明显这是不对的。所以我们需要在通过通知栏进去,或者直接点app进去以后,重新去设置第四个第五个通知到了以后,app右上角的数字。
  这个重写AppDelegate中的两个方法:didReceiveLocalNotification和applicationDidBecomeActive。
  didReceiveLdidReceiveLocalNotification是app在前台运行,通知时间到了,调用的方法。如果程序在后台运行,时间到了以后是不会走这个方法的。
  applicationDidBecomeActive是app在后台运行,通知时间到了,你从通知栏进入,或者直接点app图标进入时,会走的方法。ocalNotification和applicationDidBecomeActive
  - (void)applicationDidBecomeActive:(UIApplication *)application
  {
// Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.

//reset applicationIconBadgeNumber;
application.applicationIconBadgeNumber=0;
int count =[[[UIApplication sharedApplication] scheduledLocalNotifications] count];
if(count>0)
{
NSMutableArray *newarry= [NSMutableArray arrayWithCapacity:0];
for (int i=0; i  {
UILocalNotification *notif=[[[UIApplication sharedApplication] scheduledLocalNotifications] objectAtIndex:i];
notif.applicationIconBadgeNumber=i+1;
[newarry addObject:notif];
}
[[UIApplication sharedApplication] cancelAllLocalNotifications];
if (newarry.count>0)
  {
for (int i=0; i  {
UILocalNotification *notif = [newarry objectAtIndex:i];
[[UIApplication sharedApplication] scheduleLocalNotification:notif];
}
}
}
}
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
  {
if (notification)
{
application.applicationIconBadgeNumber=0;
int count =[[[UIApplication sharedApplication] scheduledLocalNotifications] count];
if(count>0)
{
NSMutableArray *newarry= [NSMutableArray arrayWithCapacity:0];
for (int i=0; i  {
UILocalNotification *notif=[[[UIApplication sharedApplication] scheduledLocalNotifications] objectAtIndex:i];
notif.applicationIconBadgeNumber=i+1;
[newarry addObject:notif];
}
[[UIApplication sharedApplication] cancelAllLocalNotifications];
if (newarry.count>0)
  {
for (int i=0; i  {
UILocalNotification *notif = [newarry objectAtIndex:i];
[[UIApplication sharedApplication] scheduleLocalNotification:notif];
}
}
}
}
}
  还有一个问题,本地通知是系统给缓存的,不管应用程序是否在前后台运行,通知都会存在。但我们把应用程序关了再重新运行时,按应用的逻辑,有些通知可能会重复添加,这不是我们想要的结果。所以,比较简单的办法是在程序启动的时候清空所有的本地通知,然后按应用逻辑判断再次重新添加。这个在程序首次起动回调函didFinishLaunchingWithOptions中加一个清空通知和重设应用提示数字了
  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

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

  
  return YES;
}
  当然,还有一种解决办法是每次添加时判断ID是否已存在,如果存在删了重加。个人觉得这个是一个比较蛋疼的方法,还不如程序起动时清空之后再来重加的好。。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
弥敦道KTV地址在什么地方,想过去办事,
《西游记》中给孙悟空治眼睛的是哪位神仙?
4厘7是什么意思
大清银币宣统三年一元目前值多少钱
二点4×9点九用脱式计算
blend no.555 sllver多少钱?
做护士好还是做幼师好
自有秋色伴西楼打一字谜
韩国今日汇率6.92是什么意思
桃寄生的作用和功效
配筋图中426φ18@300; 305φ18@400; 212φ18@
家里父亲是渔民,经常接触海水,渔网什么的,
QQ动态带声音的头像怎么弄
重庆渝d86868价值多少
小明同学用如图实验装置在教室内研究空气的成
推荐资讯
一七三为什么在qq被和谐,,,
不怕摔不怕水面塑配方
我老婆出去8个月了,和别人同居生活,这犯法
怎么处理银饰使其粗糙表面变光环
卡地亚的手镯是K黄的好看还是玫瑰金呢?
引起火灾的常见火源有哪些
江阴有什么特产
带目成语有哪些
那个有机器人买
历史反思六百字左右
带名和誉的成语有哪些?
有人知道这本本子的P站本宣ID和表纸ID么?求
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?