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

Ios 以编程方式清除已显示的本地通知,ios,objective-c,uilocalnotification,Ios,Objective C,Uilocalnotification,我需要以编程方式从通知中心清除已显示的本地通知。下面我实现了建议的解决方案,但问题是这个示例中的eventArray总是有0个元素。当我向下滑动到display Notification Center时,我会看到我以前创建的4个通知。所以在本例中,我希望这个数组有4个元素,但它有0个元素。你知道为什么会这样吗?我在iOS 8.3和9.2.1上试过,它们的数组都是0 iOS有两种显示本地通知的方式: NSArray *eventArray = [[UIApplication sharedAppli

我需要以编程方式从通知中心清除已显示的本地通知。下面我实现了建议的解决方案,但问题是这个示例中的
eventArray
总是有0个元素。当我向下滑动到display Notification Center时,我会看到我以前创建的4个通知。所以在本例中,我希望这个数组有4个元素,但它有0个元素。你知道为什么会这样吗?我在iOS 8.3和9.2.1上试过,它们的数组都是0

iOS有两种显示本地通知的方式:

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;
    }
}
  • 从通知中心:
    • 您不能从左向右滑动通知
    • 您可以从右向左滑动通知(从列表中删除单个通知)
    • 您可以单击通知,然后您的应用程序将启动,通知将从通知中心删除(由iOS系统处理)
  • 从锁屏:
    • 仅当您从iPhone/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;
        }
    }
    
    NSArray*eventArray=[[UIApplication sharedApplication]ScheduledLocalNotification];
    
    用于(int i=0;i用于保存唯一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] ;
            }
        }
    

    用于保存唯一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] ;
            }
        }
    
    我的理解如下: 您无法使用
    scheduledNotifications
    获取已通知的LocalNotification的信息

    我的解决方案是,只需将UILocalNotification实例保留在应用程序中的singleton对象中,并在需要从通知中心删除时调用实例
    cancelLocalNotification

    这可能是你的帮助吗?

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

    我的解决方案是,只需将UILocalNotification实例保留在应用程序中的singleton对象中,并在需要从通知中心删除时调用实例
    cancelLocalNotification


    这可能是您的帮助吗?

    我编辑了我的问题,以进一步解释问题所在。粗体文本解释了在何种情况下需要删除单个通知。链接的stackoverflow问题具有删除单个通知的代码。是否要删除特定通知?是的,我要删除单个通知这已经显示在通知中心。我刚刚下载了Gmail应用程序,并确认它与我的应用程序存在相同的问题。因此,我猜这更多是一个iOS限制,而不是我的应用程序中的错误。保存通知时,你必须传递唯一id,而不是在删除功能中,你必须获取uinotification数组并检查是否存在错误tification.userinfo等于“唯一id”然后取消通知。我正在这样做,但如果您没有阅读问题,我的问题是
    notificationArray
    包含0个元素。我可以看到屏幕上显示了4个本地通知。我编辑了我的问题,以进一步解释问题所在。粗体文本说明了在何种情况下我需要取消通知删除单个通知。链接的stackoverflow问题具有删除单个通知的代码。是否要删除特定通知?是的,我要删除已显示在通知中心的单个通知。我刚刚下载了Gmail应用程序,并确认它与我的应用程序有相同的问题。因此我猜这是更多的是iOS限制,而不是我的应用程序中的错误。保存通知时,您必须传递唯一id,而不是在删除功能中,您必须获取uinotification数组并检查notification.userinfo是否等于“唯一id”然后取消通知。我正在这样做,但如果您没有阅读问题,我的问题是
    notificationArray
    包含0个元素。我可以看到屏幕上显示了4个本地通知。