在下面的代码中,我检查当前任务(正在编辑的任务)是否具有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是否无法将其与最初安排的通知匹配?
答案 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必须检查不同属性与当前计划的通知副本的相等性,以查看哪一个匹配。