NSUserNotificationCenter解除通知

时间:2012-08-24 16:30:56

标签: cocoa nsnotificationcenter osx-mountain-lion nsusernotification

我正在尝试将新的Mountain Lion NSUserNotificationCenter用于我的应用程序(实际上并不太难)。通过

发布通知就像魅力一样
NSUserNotification *userNotification = [[NSUserNotification alloc] init];
userNotification.title = @"Some title";
userNotification.informativeText = @"Some text";

[[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:userNotification];

但是,我想在应用获得焦点后忽略屏幕上显示的所有通知。例如。就像新的消息应用程序一样。在后台收到新消息时,会显示通知。当应用程序再次变为活动状态时,这些应用程序将自动关闭并从屏幕和通知中心消失。

为了复制这个,我已经注册了NSApplicationDidBecomeActiveNotification通知的方法,该方法也被成功调用。我在那里打电话给[NSUserNotificationCenter defaultUserNotificationCenter] removeAllDeliveredNotifications]

但是,这会导致删除通知中心中收集的通知,同时仍显示右上角显示的相应“气泡”。

对所有已发送的通知进行迭代并逐个删除这些通知与使用scheduleNotification而不是deliverNotification具有完全相同的效果。

我是唯一遇到这种情况的人,还是我错过了以编程方式解除屏幕上部分和通知中心部分通知的内容?

3 个答案:

答案 0 :(得分:18)

消息应用可能正在使用私有NSUserNotificationCenter _removeAllDisplayedNotifications_removeDisplayedNotification:方法。

您可以尝试使用这些方法来测试这是否是您正在寻找的。只需添加此类别接口即可声明方法:

@interface NSUserNotificationCenter (Private)
- (void)_removeAllDisplayedNotifications;
- (void)_removeDisplayedNotification:(NSUserNotification *)notification;
@end

不幸的是,由于这些是未记录的方法,因此您无法在通过App Store分发的应用程序中使用它们。如果这确实是您正在寻找的,那么您应该file a bug并要求这些方法成为公共API的一部分。

答案 1 :(得分:4)

从10.9开始,以下方法删除所有显示的通知:

// Clear a delivered notification from the notification center. If the 
// notification is not in the delivered list, nothing happens.
- (void)removeDeliveredNotification:(NSUserNotification *)notification;

// Clear all delivered notifications for this application from the 
// notification center.
- (void)removeAllDeliveredNotifications;

自10.8以来,行为似乎已经发生了变化,因为在调用这些方法时也会删除任何显示的通知(感谢@ 0xced以便澄清)。

答案 2 :(得分:2)

removeDeliveredNotification正在删除显示的通知(10.11),必须设置通知中identifier的警告。