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

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

我遇到过人们正在调用setApplicationIconBadgeNumber为零值的post来清除通知。 这对我来说似乎很奇怪,所以我相信也许有另一种解决scheme存在?

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运行应用程序。 当应用程序最小化,我使用Notification Center中的通知启动应用程序时,可以在日志中看到clearNotifications被调用,并使用断点,我可以看到clearNotifications已经运行。 但通知仍在通知中心。 为什么?

很可能是因为通知中心是一个相对较新的function,苹果公司并不一定要推出一个全新的清理通知范例。 相反,它们是多用途的[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0]; 清除所述通知。 看起来似乎有些怪异,苹果可能会提供一个更直观的方式来做到这一点,但目前这是官方的方式。

我自己,我用这个片段:

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

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

只是扩大pcperini的答案。 正如他所提到的,您将需要将以下代码添加到您的application:didFinishLaunchingWithOptions: method;

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

需要增加然后减lessapplication:didReceiveRemoteNotification:的徽章application:didReceiveRemoteNotification:方法,如果您试图从消息中心清除消息,以便当用户从按下通知进入您的应用程序,消息中心也将清除,即;

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

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

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

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

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

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

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

如果你来这里想知道相反的情况(和我一样), 这个post可能适合你。

我无法弄清楚为什么我清除徽章时我的通知已被清除…我手动递增徽章,然后在用户进入应用程序时想清除它。 虽然没有理由清除通知中心, 他们可能仍然希望看到或采取行动通知。

负面的1幸运的是:

 [UIApplication sharedApplication].applicationIconBadgeNumber = -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]; 

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

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

如果您今后有重复通知,则不想取消这些通知,则可以通过以下方式清除通知中心中的项目:

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

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

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

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

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

这在我的应用程序完美的作品。

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

 [[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0]; 

从这里得到它。 它适用于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]; }