以编程方式清除已显示的本地通知

时间:2016-04-15 07:06:28

标签: ios objective-c uilocalnotification

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

iOS有两种呈现本地通知的方式:

  1. 来自通知中心:
    • 您无法从左向右滑动通知。
    • 您可以从右向左滑动通知(从列表中删除单个通知)。
    • 您可以点击通知,然后您的应用将启动,通知将从通知中心移除(由iOS系统处理)
  2. 来自锁定屏幕:
    • 仅在从iPhone / iPad设置启用此设置时可用:http://www.imore.com/how-disable-notification-center-lock-screen-your-iphone-and-ipad
    • 您可以从左向右滑动通知(您的应用将启动,由iOS处理)。 在这种情况下,通知中心的通知不会被删除(iOS不会将其删除,并且在通知中心已向用户显示通知后,不允许从代码中删除单个通知)
    • 您可以从右向左滑动通知(从列表中删除单个通知,由iOS处理。通知中心通知也会被删除,由iOS处理)。
    • 您无法点击通知。
  3. 编辑: 以下是代码示例我是如何做到的:

    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;
        }
    }
    

2 个答案:

答案 0 :(得分: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] ;
        }
    }

答案 1 :(得分:0)

我的理解如下: 您无法通过scheduledNotifications获取已通知的LocalNotification信息。

我的解决办法就是将UILocalNotification实例保留在应用程序的单例对象中,并在想要从通知中心删除时使用实例调用cancelLocalNotification

这可能是你的帮助吗?