我有一个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
已运行。但通知仍然在通知中心挂起。为什么呢?
答案 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应用中的所有本地通知,您应使用以下代码:
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];
}