cocoa nsnotificationcenter osx-mountain-lion nsusernotification

cocoa - NSUserNotificationCenter rechazar notificación



nsnotificationcenter osx-mountain-lion (3)

Estoy tratando de usar el nuevo Mountain Lion NSUserNotificationCenter para mi aplicación (que en realidad no es demasiado difícil). Publicar notificaciones funciona como un encanto a través de

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

Sin embargo, me gustaría descartar todas las notificaciones que están en la pantalla una vez que la aplicación se enfoca. Por ejemplo, como la nueva aplicación de mensajes lo hace. Cuando se reciben nuevos mensajes en segundo plano, se muestran las notificaciones. Cuando la aplicación vuelve a estar activa, se descartan automáticamente y desaparecen de la pantalla y del Centro de notificaciones.

Para replicar esto, he registrado un método para la notificación NSApplicationDidBecomeActiveNotification que también se llama con éxito. Allí llamo [NSUserNotificationCenter defaultUserNotificationCenter] removeAllDeliveredNotifications] .

Sin embargo, esto tiene el efecto de que las notificaciones que se han recopilado en el Centro de notificaciones se eliminan, mientras que las "burbujas" correspondientes que se muestran en la esquina superior derecha todavía se muestran.

Iterar todas las notificaciones entregadas y eliminarlas cada una por su cuenta tiene exactamente el mismo efecto, ya que tiene el uso de scheduleNotification lugar de deliverNotification .

¿Soy el único que experimenta esto o me falta algo para descartar la parte de la pantalla y la parte del Centro de notificaciones de una notificación programática?


A partir de la versión 10.9, los siguientes métodos eliminan cualquier notificación mostrada:

// 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;

El comportamiento parece haber cambiado desde 10.8, ya que todas las notificaciones mostradas se eliminan también cuando se llaman estos métodos (gracias @ 0xced para aclaración).


La aplicación de Mensajes probablemente esté utilizando el método privado NSUserNotificationCenter _removeAllDisplayedNotifications o _removeDisplayedNotification: .

Puede intentar usar estos métodos para probar si esto es lo que está buscando. Solo agrega esta interfaz de categoría para declarar los métodos:

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

Desafortunadamente, ya que estos son métodos no documentados, no puede usarlos en una aplicación distribuida a través de la App Store. Si esto es lo que está buscando, entonces debe presentar un error y solicitar que estos métodos se conviertan en parte de la API pública.


removeDeliveredNotification es la eliminación de la notificación mostrada para mí (en 10.11), la advertencia es el identifier en la notificación que debe establecerse.