Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 取消通知不';好像不行_Ios_Objective C - Fatal编程技术网

Ios 取消通知不';好像不行

Ios 取消通知不';好像不行,ios,objective-c,Ios,Objective C,在下面的代码中,我检查当前任务(正在编辑的任务)是否具有localNotification。如果是这样,我将尝试取消该通知。然后(如果fireDate还没有过),我用(可能)更改的信息更新通知的alertBody并重新安排它 问题是,如果我创建了一个通知,然后对其进行编辑,最终会出现两个通知。不知怎的,原来的那个并没有被取消 if ([currentTask localNotification]) { [[UIApplication sharedApplication] cancelLo

在下面的代码中,我检查当前任务(正在编辑的任务)是否具有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是否将无法将其与最初计划的通知相匹配?

如果UILocalNotification的任何属性在计划后发生了更改,则cancelLocalNotification将无法工作。这让我觉得cancelLocalNotification必须根据当前计划的通知副本检查不同属性的相等性,以查看哪一个是匹配的。

我将在这里为iOS 9添加我的发现。以前我有这样的代码:

UILocalNotification* notification = getNotification();
[[UIApplication sharedApplication] cancelLocalNotification: notification];
notification.alertBody = newBody;
[[UIApplication sharedApplication] scheduleLocalNotification: notification];
在iOS 9之前工作得很好,取消现有实例,然后用新的alertBody或soundName重新安排它。然后出现了iOS 9,突然运行这段代码实际上并没有取消以前的通知,所以我得到了比我想要的更多的通知

对我来说,解决办法是不懒惰地重用旧通知,因此我现在创建一个新通知,并用旧通知的字段填充它。真是一种享受

编辑:在其他情况下,
[[UIApplication sharedApplication]取消通知:通知]
不起作用时,我似乎仍然遇到问题。。。我的通知每分钟都会自动重复,似乎Xcode 7.0中有一个bug,这意味着它有时会被忽略:

编辑II:看起来在应用程序根据iOS 9构建之前,无法取消应用程序中计划的重复本地通知。。至少不容易。。。仍在寻找解决方案,因为我的应用程序以重复本地提醒通知为中心


编辑三:我已经设法摆脱了一个挥之不去的,不可取消的通知,强制退出应用程序后,试图取消它。。。这似乎起了作用。。。这不是一个很好的解决方案,当然也不是我想让我的用户做的事情,如果有其他选择的话。。。我已经发布了一个帖子,看看是否有人有进一步的想法。

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

// 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];

}
//在通知的发出日期对通知进行排序。
NSSortDescriptor*FireDateDescriptor=[NSSortDescriptor SortDescriptor WithKey:@“fireDate”升序:是];
//获取所有计划通知。
NSArray*通知=[[UIApplication sharedApplication]scheduledLocalNotifications]使用描述符进行排序:@[fireDateDesc];
//取消所有计划的通知。
[[UIApplication sharedApplication]取消所有本地通知];

对于(int i=0;我认为您需要取消现有通知,然后创建一个完整的新通知,然后安排它。问题不在于创建另一个通知,而在于取消原始通知。您是否从磁盘加载localNotification?可能是您没有获得指向现有通知的正确指针来取消通知。任务是b存储在数组中。每个任务存储自己的通知(如果有).我认为在某些情况下可能会出现这种情况…我取消了通知,稍微编辑了实例,然后重新安排,这导致了重复的通知,因为取消失败。但我已经说过,我在iOS 9上得到的情况是,如果通知被取消,取消通知就不想工作计划一段时间(在我创建通知的快速测试中效果很好,让它重复几次,然后取消)。在这种情况下,似乎有帮助的是在取消通知后强制退出应用程序……谢谢!可能与此相关的人:如果你想取消(而不是更新)一个特定的通知,然后你需要在循环中跳过它。“userInfo”字段对于唯一标识单个通知很有用。