NSUserNotificationCenter取消通知

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]

然而,这样做的效果是,已经收集到通知中心的通知被删除,而在右上角显示的相应“气泡”仍然显示。

迭代所有已交付的通知并逐个删除它们具有完全相同的效果,使用scheduleNotification而不是deliverNotification也是如此。

我是唯一遇到这个问题的人吗?还是我错过了一些东西来编程地解除通知的屏幕部分和通知中心部分?


听起来你应该在http://bugreport.apple.com上报告这个问题,而不是其他方式。 - Max Seelemann
已经完成了。我猜在苹果公司没有人会真正阅读它们,但只是为了完整起见。不确定是否有什么我遗漏了,可能是我的问题。 - BinaryBucks
你使用通知的上下文是什么?你是否需要“气泡”呢? - Oliver Cooper
通知被用于聊天应用程序。当收到消息并且应用程序没有活动时,会显示一个通知(http://cl.ly/J28h)。在查看聊天时,通知中心和屏幕上的通知应该被清除。现在,每个屏幕上的消息通知都必须被点击才能消失,如果您收到许多消息,这将非常麻烦。消息应用程序在单击单个屏幕上的通知时清除来自联系人的所有通知。注意:通知被从“通知中心”中移除,只留下屏幕上的通知。 - BinaryBucks
3个回答

18

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

你可以尝试使用这些方法来测试是否符合你的需求。只需添加此类别接口以声明这些方法:

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

很遗憾,由于这些是未记录的方法,您无法在通过App Store分发的应用程序中使用它们。如果这确实是您要寻找的内容,则您应该提交错误报告,并要求这些方法成为公共API的一部分。


使用这些私有方法确实有效,谢谢。老实说,我不知道为什么这些方法不是公共API的一部分。我会为此提交一个错误报告。 - BinaryBucks

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进行澄清)。

你确定它们是一样的吗?“Displayed” 和 “Delivered”。“10.8”上,它们的实现不同。(我还没有在“10.9”上检查过) - 0xced
在我对10.9进行的测试中,调用“-removeAllDeliveredNotifications”会删除当前显示的所有通知。我猜这在10.9上可能不是预期的行为。已编辑以反映这一点,谢谢。 - sudo rm -rf

2

removeDeliveredNotification 函数可以帮助我删除已经显示的通知(在10.11版本上),但是需要设置通知的 identifier 参数。


同样适用于macOS 10.13。 - Pavel Lobodinský

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接