20

我正在尝试将新的 Mountain Lion NSUserNotificationCenter 用于我的应用程序(实际上并不太难)。发布通知就像一个魅力通过

NSUserNotification *userNotification = [[NSUserNotification alloc] init];
userNotification.title = @"Some title";
userNotification.informativeText = @"Some text";

[[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:userNotification];

但是,一旦应用程序获得焦点,我想关闭屏幕上的所有通知。例如,就像新的消息应用程序那样。在后台收到新消息时,会显示通知。当应用再次激活时,它们会自动关闭并从屏幕和通知中心消失。

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

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

迭代所有传递的通知并单独删除它们具有完全相同的效果,就像 usingscheduleNotification而不是deliverNotification.

我是唯一一个遇到这种情况的人,还是我错过了以编程方式关闭通知的屏幕部分和通知中心部分的东西?

4

3 回答 3

18

Messages 应用程序可能正在使用私有 NSUserNotificationCenter_removeAllDisplayedNotifications_removeDisplayedNotification:方法。

您可以尝试使用这些方法来测试这是否是您要查找的内容。只需添加这个类别接口来声明方法:

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

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

于 2012-10-03T23:19:20.413 回答
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 的澄清)。

于 2013-11-27T07:24:51.490 回答
2

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

于 2016-01-22T22:44:39.170 回答