以编程方式从通知托盘中删除 UILocalNotification
Posted
技术标签:
【中文标题】以编程方式从通知托盘中删除 UILocalNotification【英文标题】:Removing UILocalNotification from notification tray programmatically 【发布时间】:2013-01-03 15:57:51 【问题描述】:有没有办法以编程方式从通知托盘中删除/关闭UILocalNotification
。
我可以取消删除通知的通知
[[UIApplication sharedApplication] scheduledLocalNotifications]
这是我需要做的事情
我需要在执行操作后(即用户点击通知后)从 NotificationTray 中关闭 UILocalNotification
编辑:
我可以从NSNotificationCenter
中删除通知。我想从 通知托盘 中删除特定通知。就像用户按下清除按钮以清除属于特定应用程序的所有通知一样。
【问题讨论】:
你是说通知中心吗? 我是指显示在应用外的通知栏! 【参考方案1】:您可以使用以下方式取消所有通知:
[[UIApplication sharedApplication] cancelAllLocalNotifications];
如果要删除特定通知,可以使用通知对象的userinfo
,在创建本地通知时为其添加唯一 ID。稍后您可以使用该 ID 删除本地通知。
为此,您可以使用以下代码:
NSString *notificationId = @"id_to_cancel";
UILocalNotification *notification = nil;
for(UILocalNotification *notify in [[UIApplication sharedApplication] scheduledLocalNotifications])
if([[notify.userInfo objectForKey:@"ID"] isEqualToString:notificationId])
notification = notify;
break;
[[UIApplication sharedApplication] cancelLocalNotification:notification];
【讨论】:
如果通知已经显示为 'scheduledLocalNotifications' 这不起作用,将返回零条目(因为它不再是 'scheduled' 并且已经触发)。有没有其他方法可以在点击时删除通知?【参考方案2】:我相信我也遇到过类似的问题。当应用程序进入前台时,我尝试清除过去的通知以从通知托盘中删除所有旧通知。
我做了这样的事情来抓取旧通知并将它们删除:
NSArray *activeNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications];
NSArray *pastNotifications = [activeNotifications filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"firDate < %@", [NSDate date]]];
for (UILocalNotification *notification in pastNotifications)
[[UIApplication sharedApplication] cancelLocalNotification:notification];
但是,scheduledLocalNotifications
似乎不包括其触发日期已过的位置,即使它们仍然出现在通知中心。
调用cancelAllLocalNotifications
似乎也可以删除过去的通知。所以我们可以抓取所有当前通知,取消所有通知,然后将我们仍然感兴趣的添加回来。
// Grab all the current notifications
NSArray *activeNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications];
// Clear all notifications to remove old notifications
[[UIApplication sharedApplication] cancelAllLocalNotifications];
// Add back the still relevant notifications
for (UILocalNotification *notification in activeNotifications)
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
此外,如果不再需要某些通知,我们可以在添加它们之前对通知进行一些过滤,并且我们可以在应用程序激活时获取活动通知,将它们存储在实例变量中,并且仅在应用移至后台
【讨论】:
grt!谢谢。它wrkd。【参考方案3】:[UIApplication sharedApplication].applicationIconBadgeNumber = 0;
也会有一些技巧
但是如果你没有使用 applicationIconBadgeNumber,它将无法工作,所以设置了技巧 applicationIconBadgeNumber 优先:)
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:1];
【讨论】:
【参考方案4】:如果应用程序没有运行,您将在
中收到本地通知对象-applicationDidFinishLaunchingWithOptions:
喜欢:
UILocalNotification *localNotif = [launchOptions objectForKey: UIApplicationLaunchOptionsLocalNotificationKey];
否则你可以得到它
(void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
现在您可以使用
从通知中心删除它[[UIApplication sharedApplication] cancelLocalNotification:notificationToCancel];
【讨论】:
【参考方案5】:// deletes a pushnotification with userInfo[id] = id
-(void)deleteLocalPushNotificationWithId:(NSString*)id
for(UILocalNotification *notification in [[UIApplication sharedApplication] scheduledLocalNotifications])
if([[notification.userInfo objectForKey:@"id"] isEqualToString:id])
[[UIApplication sharedApplication] cancelLocalNotification:notification];
// deletes all fired pushnotifications
-(void)clearLocalPushNotifications
NSArray *activeNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications];
// Clear all notifications to remove old notifications
[[UIApplication sharedApplication] cancelAllLocalNotifications];
// Add back the still relevant notifications
for (UILocalNotification *notification in activeNotifications)
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
【讨论】:
【参考方案6】:我正在摆弄一些代码,我想知道如果应用程序在前台,为什么本地通知会存储在通知中心。这可能是因为 Apple 不知道你在用它们做什么,而且老实说不在乎;所以他们做他们的工作。
就问题而言,我做了以下事情:
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
if (application.applicationState == UIApplicationStateActive)
NSLog(@"active");
// display some foreground notification;
[application cancelLocalNotification:notification];
else
NSLog(@"inactive");
【讨论】:
【参考方案7】:因此,我刚刚阅读了有关如何从通知中心关闭/删除所有已触发的本地通知的帖子,如果用户通过单击应用程序图标而不是通知来打开应用程序。但毕竟这一切,其他计划的本地通知应该会在未来触发。
这是我的简单解决方案,应该在应用程序变为Active时触发:
UIApplication* application = [UIApplication sharedApplication];
NSArray* scheduledNotifications = [NSArray arrayWithArray:application.scheduledLocalNotifications];
application.scheduledLocalNotifications = scheduledNotifications;
我试过 [[UIApplication sharedApplication] cancelLocalNotification:notification];但它没有从通知中心(应用程序外部)清除已经触发的本地通知。
【讨论】:
以上是关于以编程方式从通知托盘中删除 UILocalNotification的主要内容,如果未能解决你的问题,请参考以下文章
从托盘中删除 Firebase 通知(Android、Unity SDK)