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

时间:2011-12-30 17:15:22

标签: objective-c cocoa-touch apple-push-notifications

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

我遇到的帖子是人们将setApplicationIconBadgeNumber调用为零值以清除通知。这对我来说似乎很奇怪,所以我相信也许存在另一种解决方案?

EDIT1:

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

- (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已运行。但通知仍然在通知中心挂起。为什么呢?

12 个答案:

答案 0 :(得分:156)

最有可能因为通知中心是一个相对较新的功能,Apple并不一定想推出一个全新的清除通知范例。因此,他们多用[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];来清除所述通知。这可能看起来有点奇怪,Apple可能会在未来提供一种更直观的方式来做到这一点,但目前这是正式的方式。

我自己,我使用这个片段:

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

永远无法从通知中心清除所有应用的通知。

答案 1 :(得分:117)

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

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

还需要递增,然后在application:didReceiveRemoteNotification:方法中减少徽章,如果您尝试清除来自消息中心的消息,以便当用户从按下a键输入您的应用时通知消息中心也将清除,即;

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

答案 2 :(得分:20)

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

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

答案 3 :(得分:14)

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的本地通知清除。对于iOS 10.x代码,您需要import UserNotifications

答案 4 :(得分:9)

如果您有待处理的预定本地通知,并且不希望在通知中心中使用cancelAllLocalNotifications清除旧通知,则还可以执行以下操作:

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

如果您设置scheduledLocalNotifications它会清除Notification Center中的旧版本,并将其设置为自身,则会保留待处理的本地通知。

答案 5 :(得分:3)

如果你来到这里想知道相反(就像我一样),this帖子可能适合你。

当我清除徽章时,我无法弄清楚为什么我的通知会被清除...我手动递增徽章,然后想要在用户进入应用程序时清除它。但是,没有理由清除通知中心;他们可能仍希望查看或处理这些通知。

负面的1诀窍,幸运的是:

[UIApplication sharedApplication].applicationIconBadgeNumber = -1;

答案 6 :(得分: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];

答案 7 :(得分:1)

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

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

答案 8 :(得分:0)

如果您将来再次发出通知,则不想取消这些通知,您可以通过以下方式清除通知中心中的项目:

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

当您的应用在前台打开时,您无法在收到本地通知后立即调用以下方法清除通知,否则您将收到数百条通知。也许是因为相同的通知再次适用,现在是时候开火,所以你继续开火,再次申请,开火,申请......:

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

答案 9 :(得分:0)

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

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

[[UIApplication sharedApplication] cancelAllLocalNotifications];

这在我的应用程序中完美运行。

答案 10 :(得分:0)

您需要在AppDelegate applicationDidBecomeActive方法中添加以下代码。

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];

答案 11 :(得分:-1)

here获得。它适用于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];
}