11

是否有可能做到这一点?UIApplication's scheduledLocalNotifications似乎没有返回已经发送到用户通知中心的通知,所以我认为这可能是设计使然,但我找不到任何有据可查的证据。

有人知道吗?

谢谢!

编辑:发现这个:

您可以通过在应用程序对象上调用 cancelLocalNotification: 来取消特定的计划通知,并且您可以通过调用 cancelAllLocalNotifications 来取消所有计划的通知。这两种方法也以编程方式关闭当前

这里:http: //developer.apple.com/library/mac/#documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/IPhoneOSClientImp/IPhoneOSClientImp.html

但是,如果scheduledLocalNotifications没有给我已经发送的通知,我如何获得对已发送通知的引用?

编辑2:

在我注册了一些通知之后,这就是我想要做的事情:

UIApplication *app = [UIApplication sharedApplication];

for (UILocalNotification *localNotification in app.scheduledLocalNotifications) 
{
     if (someCondition) {
            [app cancelLocalNotification:localNotification];
        }
     }
}

问题是,一旦它们被交付,它们就不再处于“scheduledLocalNotifications”中。

4

6 回答 6

11

您可以通过将新创建的通知添加到您自己NSMutableArray的通知中来解决此问题,并检查该数组而不是app.scheduledLocalNotifications. 像这样的东西:

NSMutableArray在您的 Viewcontrollers .h 文件中添加一个:

NSMutableArray *currentNotifications;

在启动 ViewController 时启动它

currentNotifications = [[NSMutableArray alloc] init];

启动通知时,还将其添加到您的数组中:

UILocalNotification *notification = [[UILocalNotification alloc] init];
...
[currentNotifications addObject:notification];
[[UIApplication sharedApplication] presentLocalNotificationNow:notification];

稍后当您想取消该通知时,请改为在您的数组中查找它。也将其从您的阵列中删除:

for (UILocalNotification *notification in currentNotifications) {
    if (someCondition) {
        [[UIApplication sharedApplication] cancelLocalNotification:notification];
        [currentNotifications removeObject:notification];
    }
}
于 2012-09-27T09:37:13.590 回答
5

从 iOS10 开始,如果您已经过渡到使用UNUserNotificationCenter.

苹果文档状态:

func getDeliveredNotifications(completionHandler: @escaping ([UNNotification]) -> Void)

为您提供仍显示在通知中心的应用通知列表。

func removeDeliveredNotifications(withIdentifiers: [String])

从通知中心删除指定的通知。

func removeAllDeliveredNotifications()

从通知中心删除所有应用程序的通知。

于 2017-02-07T12:53:06.390 回答
2

我也一直在寻找这个问题的答案。我的问题是我想“清理”通知中心中所有与应用程序相关的通知,以防用户从其停靠图标打开应用程序(因为这对先前触发的通知没有任何作用......)

幸运的是,这似乎cancelAllNotifications不仅取消了预定的,而且还取消了一切。所以我只是在爆破它们之前保留对现有预定通知的参考,然后相应地重新安排它们:

UIApplication *app = [UIApplication sharedApplication];

NSLog(@"\nScheduled notif count (prior) = %d", app.scheduledLocalNotifications.count);

NSArray *scheduledNotifs = app.scheduledLocalNotifications; // hold on to a reference

[[UIApplication sharedApplication] cancelAllLocalNotifications]; // blast everything

NSLog(@"\nScheduled notif count (post-wipeout) = %d", app.scheduledLocalNotifications.count);

for (UILocalNotification *notif in scheduledNotifs) {
    [app scheduleLocalNotification:notif]; // put them back
}

NSLog(@"\nScheduled notif count (post-repopulation) = %d", app.scheduledLocalNotifications.count);

不确定这是否对任何人有帮助,但这对我的情况很有帮助。

于 2013-07-18T21:59:14.163 回答
1

试试这个链接:

苹果文档

一些教程

并且本地通知正在注册到设备通知中心,而不是在您的应用程序中。

但是,如果您的应用程序正在运行,并且是通知时间,那么您可以在游戏中获取通知参数:

-(void) application:(UIApplication*)app didReceiveLocalNotification:(UILocalNotification*) notification
{
// local notification is geted
}
于 2012-05-18T12:17:33.957 回答
1

如果您还将通知保存在 NSUserDefaults 中,则可以在安排通知时执行此操作,使用 NSKeyedArchiver 将其转换为 NSData。

要将其作为 UILocalNotification 取回,请使用 NSKeyedUnarchiver。然后,您可以使用 cancelLocalNotification 方法将其删除。

在这里充分解释(Swift 版本 + 原始 Obj-C 解决方案的链接)

于 2015-09-04T04:36:18.977 回答
0

看到您更新的代码后,您似乎有兴趣在 for 循环中取消所有通知,因此您可以使用 -

 [[UIApplication sharedApplication] cancelAllLocalNotifications];
于 2012-05-18T13:51:24.900 回答