iOS应用程序:如何清除通知?


109

我有一个iOS应用程序,其中向其中发送了一些推送通知。我的问题是,在点击邮件/通知后,它们会留在iOS的通知中心中。下次打开应用程序时,如何在通知中心中为我的应用程序删除通知?

我碰到过有人呼吁setApplicationIconBadgeNumber零值清除通知的帖子。对我来说这似乎很奇怪,所以我相信也许存在另一种解决方案?

编辑1:

我在清除通知时遇到了一些问题。请在这里查看我的代码:

- (void) clearNotifications {
    [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
    [[UIApplication sharedApplication] cancelAllLocalNotifications];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (launchOptions != nil)
    {
        NSDictionary* dictionary = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
        if (dictionary != nil)
        {
            NSLog(@"Launched from push notification: %@", dictionary);

            [self clearNotifications];
        }
    }

    return YES;
}

- (void)application:(UIApplication*)application didReceiveRemoteNotification:(NSDictionary*)userInfo
{    
    NSLog(@"Received notification: %@", userInfo);
    [self clearNotifications];
}

我正在通过Xcode运行该应用程序。当最小化应用程序并使用通知中心中的通知启动应用程序时,我可以在日志中看到didReceiveRemoteNotification调用了,并使用断点看到了clearNotifications已运行。但是通知仍然挂在通知中心中。为什么?

Answers:


157

很可能是因为Notification Center是一个相对较新的功能,Apple并不一定要推动全新的范例来清除通知。因此,他们有多种用途[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];来清除所说的通知。这似乎有点怪异,Apple将来可能会提供一种更直观的方式来执行此操作,但暂时这是官方方式。

我自己,使用以下代码段:

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];

永远不会从通知中心清除该应用程序的所有通知。


cancelAllLocalNotifications是已过时- developer.apple.com/documentation/uikit/uiapplication/... 你需要使用 let center = UNUserNotificationCenter.current() center.removeAllDeliveredNotifications() // To remove all delivered notifications stackoverflow.com/a/40397907/1155650
罗希特VIPIN马修斯

119

只是为了扩大pcperini的答案。正如他提到的那样,您需要将以下代码添加到您的application:didFinishLaunchingWithOptions:方法中;

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];

需要增加然后再递减徽章在你的application:didReceiveRemoteNotification:方法,如果你想清除从信息中心的消息,这样,当用户输入您的应用程式按通知信息中心将同样明显,即;

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 1];
[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];

我认为不需要cancelAllLocalNotifications。在没有该限制的情况下为我工作
Murali

@Murali取决于您是否使用本地通知...?
亚历杭德罗·伊万

1
UPDATE ::“ cancelAllLocalNotifications”已被弃用:在iOS 10.0中已被弃用。因此,如果您的应用程序版本高于iOS10.0,则应使用此UNUserNotificationCenter * center = [UNUserNotificationCenter currentNotificationCenter];[center removeAllDeliveredNotifications]; [center removeAllPendingNotificationRequests];
User18474728

21

在applicationDidBecomeActive中添加对clearNotifications的调用也可能很有意义,这样,如果应用程序在后台并返回,它也会清除通知。

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [self clearNotifications];
}

15

iOS 10更新(Swift 3)

为了清除iOS 10应用中的所有本地通知,您应该使用以下代码:

import UserNotifications

...

if #available(iOS 10.0, *) {
    let center = UNUserNotificationCenter.current()
    center.removeAllPendingNotificationRequests() // To remove all pending notifications which are not delivered yet but scheduled.
    center.removeAllDeliveredNotifications() // To remove all delivered notifications
} else {
    UIApplication.shared.cancelAllLocalNotifications()
}

此代码处理针对iOS 10.x和所有先前版本的iOS的本地通知的清除。您将需要import UserNotificationsiOS 10.x代码。


9

如果您有待处理的计划本地通知,并且不想cancelAllLocalNotifications在Notification Center中清除旧通知,则还可以执行以下操作:

[UIApplication sharedApplication].scheduledLocalNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;

看来,如果设置,scheduledLocalNotifications它将清除通知中心中的旧通知,并将其设置为自身,则保留待处理的本地通知。


1
在iOS 9上,这对我来说就像是一种符咒。我不想取消所有通知,因为它们会及时(每天或每周)重复。这样,我可以清除所有内容而不删除它们。
superpuccio

1
到目前为止,我所见过的最好的解决方案。有人知道它是否可以在iOS 8上运行吗?
duncanc4 2015年

上次我在iOS 8上测试@ duncanc4时,它正常工作。
ospr

您在应用程序中的何处调用此名称?
Alex Zavatone '16

Alex,您需要在“通知中心”中清除通知时应调用它。我在AppDelegate applicationDidBecomeActive:application:didReceiveLocalNotification:方法中都调用它。
ospr

3

在Swift中,我在AppDelegate中使用以下代码:

func applicationDidBecomeActive(application: UIApplication) {
    application.applicationIconBadgeNumber = 0
    application.cancelAllLocalNotifications()
}

3

如果您来这里是想知道相反的事情(就像我以前一样),那么这篇文章可能适合您。

我不知道清除徽章时为何清除通知...我手动增加徽章,然后想在用户进入应用程序时清除它。不过,这没有理由清理通知中心。他们可能仍想查看或执行这些通知。

幸运的是,负1可以解决问题:

[UIApplication sharedApplication].applicationIconBadgeNumber = -1;

1
它在iOS9中对您有用吗?将徽章设置为0或-1并没有发现任何区别。在我的情况下,它仍会清除所有远程通知。
AlexeyVMP

是的,我实际上开始再次通过我的应用程序注意到这一点;我不知道发生了什么变化。
TahoeWolverine '16

自苹果公司以某种方式决定无徽章编号的应用程序应该没有任何通知后,我就放弃了
AlexeyVMP

1

也许有计划的警报和未清除的应用程序图标徽章。

NSArray *scheduledLocalNotifications = [application scheduledLocalNotifications];
NSInteger applicationIconBadgeNumber = [application applicationIconBadgeNumber];

[application cancelAllLocalNotifications];
[application setApplicationIconBadgeNumber:0];

for (UILocalNotification* scheduledLocalNotification in scheduledLocalNotifications) {
    [application scheduleLocalNotification:scheduledLocalNotification];
}
[application setApplicationIconBadgeNumber:applicationIconBadgeNumber];

0

当您以后有重复的通知时,您不想取消这些通知,可以通过以下方式在通知中心清除该项目:

func clearNotificationCenter() {
    UIApplication.sharedApplication().applicationIconBadgeNumber = 1
    UIApplication.sharedApplication().applicationIconBadgeNumber = 0
}

收到本地通知后,您无法通过在前台打开应用程序时清除通知来清除通知,否则您将收到数以百计的通知。可能是因为相同的通知再次适用,现在是解雇的时候了,所以您保持解雇,再次申请,解雇,申请....:

[UIApplication sharedApplication].scheduledLocalNotifications = [UIApplication sharedApplication].scheduledLocalNotifications;

0

从应用程序注销时,那时您必须在注销按钮单击方法上使用下面的代码行。

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

[[UIApplication sharedApplication] cancelAllLocalNotifications];

这在我的应用程序中非常有效。



-1

这里得到它。适用于iOS 9

UIApplication *app = [UIApplication sharedApplication];
NSArray *eventArray = [app scheduledLocalNotifications];
for (int i=0; i<[eventArray count]; i++)
{
    UILocalNotification* oneEvent = [eventArray objectAtIndex:i];
    //Cancelling local notification
    [app cancelLocalNotification:oneEvent];
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.