cancelLocalNotification似乎不起作用

时间:2014-07-09 16:29:04

标签: ios objective-c

在下面的代码中,我检查当前任务(正在编辑的任务)是否具有localNotification。如果是这样,我会尝试取消该通知。然后(如果fireDate尚未通过)我用(可能)更改的信息更新通知的alertBody并重新安排它。

问题在于,如果我创建通知然后进行编辑,我最终会收到两个通知。不知怎的,原来的一个没有被取消......

if ([currentTask localNotification])
{
    [[UIApplication sharedApplication] cancelLocalNotification:[currentTask localNotification]];
    if ([[NSDate date] compare:[currentTask localNotification].fireDate] == NSOrderedAscending)
    {
        NSLog(@"current task name: %@", [currentTask name]);
        NSString *temp = [NSString stringWithFormat:@"Alert:\n%@", [currentTask name]];
        [[currentTask localNotification] setAlertBody:temp];
        [[UIApplication sharedApplication] scheduleLocalNotification:[currentTask localNotification]];
    }
    else
        [currentTask setLocalNotification:nil];
}

有关此问题的任何见解吗?

我知道在安排通知时会复制一份副本 - cancelLocalNotification如何找到正确的副本?它是通过测试属性是否相等来实现的?或者它是否复制指针地址并将其匹配?换句话说,如果更改了其中一个属性,cancelLocalNotification是否无法将其与最初安排的通知匹配?

3 个答案:

答案 0 :(得分:2)

我会在iOS 9中添加我的发现。之前我的代码就像这样:

UILocalNotification* notification = getNotification();
[[UIApplication sharedApplication] cancelLocalNotification: notification];
notification.alertBody = newBody;
[[UIApplication sharedApplication] scheduleLocalNotification: notification];

在iOS 9之前工作得很好,取消现有实例,然后使用新的alertBody或soundName重新安排它。然后沿着iOS 9突然运行此代码并没有实际取消之前的通知,所以我收到的通知比我想要的更多!

我的修复是在重复使用旧通知时不要懒,所以我现在创建一个新通知并用旧通知的字段填充它。干得好!

编辑:我似乎仍然遇到[[UIApplication sharedApplication] cancelLocalNotification: notification]无法在其他情况下工作的问题...我已经让我的通知每分钟自动重复一次,似乎Xcode 7.0中可能存在错误意味着它有时会被忽略:https://forums.developer.apple.com/thread/9226

编辑II:看起来在应用程序中针对iOS 9构建之前重复安排的本地通知似乎无法取消..至少不容易......仍在努力寻找解决方案,因为我的应用是以重复本地通知提醒为中心!

编辑III:我试图通过在试图取消它之后强行退出应用程序来摆脱挥之不去的,不可取消的通知......这似乎已经奏效......它'这不是一个很好的解决方案,当然不是我希望让用户做的事情,如果有某种替代方案......我已发布separate question以查看是否有任何进一步的想法

答案 1 :(得分:1)

我遇到了同样的问题。我使用的解决方案是。

// Sort the notification on the fire date of the notification.
NSSortDescriptor * fireDateDesc = [NSSortDescriptor sortDescriptorWithKey:@"fireDate" ascending:YES];

//get all scheduled notifications.
NSArray * notifications = [[[UIApplication sharedApplication] scheduledLocalNotifications] sortedArrayUsingDescriptors:@[fireDateDesc]];

// Cancel all scheduled notifications.
[[UIApplication sharedApplication] cancelAllLocalNotifications];

for (int i=0; i<[notifications count]; i++){

    UILocalNotification* oneEvent = [notifications objectAtIndex:i];

    // update notification data here an then schedule the notification.

    [[UIApplication sharedApplication] scheduleLocalNotification:oneEvent];

}

逐一取消UILocalNotifications以更新通知中的内容会产生有时通知不会被取消的问题。

所以我实施的解决方案是:

1:获取所有预定通知并将其存储在您喜欢的任何内容中。

2:然后取消所有预定的通知。

3:从第一步循环到通知,更新您想要的任何内容并随时安排通知。

希望这会有所帮助。

答案 2 :(得分:0)

看起来如果UILocalNotification的任何属性自调度后已经更改,则cancelLocalNotification将不起作用。这让我认为cancelLocalNotification必须检查不同属性与当前计划的通知副本的相等性,以查看哪一个匹配。