19

我正在尝试为我的应用程序使用新的Mountain Lion NSUserNotificationCenter(实际上并不太难)。发布通知,通过NSUserNotificationCenter关闭通知

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

[[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:userNotification]; 

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

要复制这个,我已经注册了一个方法到NSApplicationDidBecomeActiveNotification通知,它也被成功调用。在那里我叫[NSUserNotificationCenter defaultUserNotificationCenter] removeAllDeliveredNotifications]

但是,这样做的效果是,通知中心收集的通知将被删除,同时仍显示右上角显示的相应“泡泡”。

迭代所有交付的通知并将它们各自移除它们具有完全相同的效果,因为使用scheduleNotification而不是deliverNotification

我是唯一一个遇到这种情况的人,还是我缺少一些以编程方式忽略通知屏幕部分和通知中心部分?

+0

听起来像你应该报告这是http://bugreport.apple.com上的错误。 –

+0

已经做到了。并不是说苹果公司的任何人都会真正阅读它们,但只是为了完成。不知道我是否在这里错过了一些东西,尽管这是我的错。 – BinaryBucks

+0

在什么情况下你使用通知,你需要有'气泡'吗? –

回答

17

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

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

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

不幸的是,因为这些无证方法,你可以不通过App Store分发的应用程序中使用它们。如果这确实是您正在寻找的内容,那么您应该要求这些方法成为公共API的一部分。

+0

使用这些私有方法确实可行,谢谢。我不知道为什么这些方法不是公共API tbh的一部分。我会为它提交一个错误报告。 – BinaryBucks

3

由于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为澄清)。

+0

你确定它们是一样的吗? **显示** vs **交付**。在10.8上,它们的实现不一样。 (我没有检查过10.9) – 0xced

+0

至少我在10.9上执行了一个测试,调用'-removeAllDeliveredNotifications'删除了当前显示的任何通知。我想这不应该是10.9的行为。编辑反映,谢谢。 –

1

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