【问题标题】:NSUserNotificationCenter dismiss notificationNSUserNotificationCenter 关闭通知
【发布时间】:2012-08-20 05:57:18
【问题描述】:

我正在尝试将新的 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

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

【问题讨论】:

  • 听起来你应该在bugreport.apple.com上报告这个错误。
  • 已经这样做了。我猜并不是苹果公司的任何人都真正阅读过它们,而只是为了完成。不确定我是否在这里遗漏了什么,但这是我的错。
  • 你在什么情况下使用通知,你需要有'气泡'吗?
  • 通知用于聊天应用程序。当收到消息并且应用程序未处于活动状态时,将显示通知 (cl.ly/J28h)。查看聊天时,通知中心的通知及其屏幕通知应被清除。现在,必须单击屏幕上的每条消息通知才能使其消失,如果您收到很多消息,这会很烦人。单击单个屏幕通知时,消息应用程序会清除联系人的所有通知。注意:通知会从通知中心移除,只保留屏幕上的通知。

标签: cocoa nsnotificationcenter osx-mountain-lion nsusernotification


【解决方案1】:

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

【讨论】:

  • 这同样适用于 macOS 10.13。
【解决方案2】:

从 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 的澄清)。

【讨论】:

  • 你确定它们是一样的吗? 已展示已投放。在 10.8 上,它们的实现并不相同。 (10.9我还没查)
  • 至少在我在 10.9 上执行的测试中,调用 -removeAllDeliveredNotifications 删除了当前显示的所有通知。我想这一定不是 10.9 上的行为。编辑以反映这一点,谢谢。
【解决方案3】:

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

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

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

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

【讨论】:

  • 使用这些私有方法确实有效,谢谢。我不知道为什么这些方法不是公共 API tbh 的一部分。我会为此提交一份错误报告。
猜你喜欢
  • 2014-02-02
  • 2013-03-31
  • 2013-03-12
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多