以编程方式从通知托盘中删除 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的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中以编程方式从通知栏中删除通知?

从托盘中删除 Firebase 通知(Android、Unity SDK)

Phonegap 从后台推送通知 OnResume,它会从托盘中删除我的所有通知

如何以编程方式更改UIButton标签

Android:是不是可以以编程方式删除系统管理的通知?

Android:以编程方式删除标题/通知栏