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