2016-04-15 56 views
0

我需要以编程方式清除已通过通知中心显示的本地通知。继this link之后,我实现了建议的解决方案,但问题是该示例中的eventArray始终有0个元素。当我向下滑动显示通知中心时,我会看到之前创建的4个通知。所以在这种情况下,我期望这个数组有4个元素,但它有0个。任何想法为什么这样?我已经尝试过iOS 8.3和9.2.1,并且它们都是0。以编程方式清除已显示的本地通知

的iOS有2种方式呈现局部的通知:

  1. 从通知中心:
    • 你不能滑开的通知,由左到右。
    • 您可以从右向左滑动通知(从列表中删除单个通知)。
    • 您可以点击通知,之后您的应用程序将启动,并通知将从通知中心(由iOS系统的处理)
  2. 从锁定屏幕上消失:
    • 仅当您启用此设置从iPhone/iPad设置:http://www.imore.com/how-disable-notification-center-lock-screen-your-iphone-and-ipad
    • 您可以从左向右滑动通知(您的应用程序将启动,由iOS处理)。 在这种情况下,通知中心的通知不会被删除(iOS不会删除它,并且不允许在通知已经向用户通知中心呈现通知后从代码中删除单个通知)
    • 您可以从右向左滑动通知(从列表中删除单个通知,由iOS处理。通知中心通知也会被删除,由iOS处理)。
    • 您无法点击通知。

编辑: 这里是代码示例中,我是如何做到了:

UILocalNotification* localNotification = [[UILocalNotification alloc] init]; 
localNotification.alertBody = @"1"; 
localNotification.alertTitle = @"1"; 
localNotification.userInfo = uniqueDictIdentifier1; 
[[UIApplication sharedApplication] presentLocalNotificationNow:localNotification]; 

UILocalNotification *localNotification2 = [[UILocalNotification alloc] init]; 
localNotification2.alertBody = @"2"; 
localNotification2.alertTitle = @"2"; 
localNotification2.userInfo = uniqueDictIdentifier2; 
[[UIApplication sharedApplication] presentLocalNotificationNow:localNotification2]; 

.... 
//2 more notifications are created like this 

再有就是代码用于过滤所有通知:

NSArray *eventArray = [[UIApplication sharedApplication] scheduledLocalNotifications]; 
for (int i=0; i<[eventArray count]; i++) { 
    UILocalNotification* oneEvent = [eventArray objectAtIndex:i]; 
    NSDictionary *userInfoCurrent = oneEvent.userInfo; 
    if ([userInfoCurrent isEqualToDictionary:uniqueDictIdentifier1]) { 
     [[UIApplication sharedApplication] cancelLocalNotification:oneEvent]; 
     break; 
    } 
} 

回答

0

用于保存通知一个唯一的ID

NSDictionary * infoDict = @{ @"alarmUiqueId" : uID, 

            }; 
    NSLog(@"%@",infoDict); 
    NSDateComponents *comp = [[NSCalendar currentCalendar] components:NSCalendarUnitSecond 
                  fromDate:fireDate]; 
    fireDate = [fireDate dateByAddingTimeInterval:-comp.second]; 
    UILocalNotification *localNotif = [[UILocalNotification alloc] init]; 
    localNotif.fireDate = fireDate; 
    localNotif.timeZone = [NSTimeZone localTimeZone]; 
    localNotif.alertBody = desString; 
    localNotif.userInfo = infoDict; 
    localNotif.repeatInterval = NSCalendarUnitDay; 
    [[UIApplication sharedApplication] scheduleLocalNotification:localNotif] 

并删除一个paritcular通知写这段代码。

NSArray *notificationArray = [[UIApplication sharedApplication] scheduledLocalNotifications]; 

    for(UILocalNotification *notification in notificationArray) 
    { 
     NSLog(@"%@",[notification.userInfo valueForKey:@"alarmUiqueId"]); 
     if ([[notification.userInfo valueForKey:@"alarmUiqueId"] isEqualToNumber: health.uniqueId]) 
     { 
      [[UIApplication sharedApplication] cancelLocalNotification:notification] ; 
     } 
    } 
+0

我编辑了我的问题来进一步解释问题是什么。粗体文本解释了我需要删除单个通知的情况。链接的stackoverflow问题有删除单个通知的代码。 –

+0

你想删除一个特定的通知? –

+0

是的,我想删除已经显示在通知中心的单个通知。我刚刚下载了Gmail应用,并确认它与我的应用具有相同的问题。所以我想这是一个iOS限制,而不是我的应用程序中的一个错误。 –

0

我的理解是如下: 你不能scheduledNotifications已经得到通知LocalNotification的信息。

我的解决方案是只在应用程序中将UILocalNotification实例保存在您的单例对象中,并且在您想要从通知中心删除时使用实例调用cancelLocalNotification

这可能是你的帮忙吗?