19

Estoy tratando de usar el nuevo Mountain Lion NSUserNotificationCenter para mi aplicación (que no es muy difícil en realidad). La publicación de notificaciones funciona como un encanto a través deNSUserNotificationCenter descartar la notificación

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 se encuentran en la pantalla una vez que las ganancias de aplicaciones se centran. P.ej. al igual que la nueva aplicación de mensajes lo hace. Cuando se reciben mensajes nuevos en segundo plano, se muestran las notificaciones. Cuando la aplicación se vuelve a activar, se eliminan 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 recibe un llamado con éxito. Allí llamo al [NSUserNotificationCenter defaultUserNotificationCenter] removeAllDeliveredNotifications].

Esto, sin embargo, tiene el efecto de que las notificaciones que se han recopilado en el Centro de notificaciones se eliminan mientras se muestran las "burbujas" correspondientes que se muestran en la esquina superior derecha.

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

¿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áticamente?

+0

Parece que debería informar esto como un error en http://bugreport.apple.com. –

+0

Ya hice eso. No es que alguien en Apple realmente los lea, supongo, pero solo para completarlo. No estoy seguro si no me falta algo aquí y es una falla de mi parte. – BinaryBucks

+0

¿En qué contexto estás usando las notificaciones, necesitas tener las "burbujas"? –

Respuesta

17

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

Puede intentar utilizar estos métodos para comprobar si esto es lo que está buscando. Sólo tiene que añadir esta interfaz categoría de declarar los métodos:

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

Por desgracia, ya que estos son métodos sin papeles, no se puede utilizar en una aplicación distribuida a través de la App Store. Si esto es lo que está buscando, entonces debe file a bug y solicitar estos métodos para formar parte de la API pública.

+0

El uso de estos métodos privados sí funciona, gracias. No tengo ni idea de por qué esos métodos no son parte de la API pública tbh. Voy a presentar un informe de error para ello. – BinaryBucks

3

A partir del 10.9, los siguientes métodos eliminar cualquier notificaciones exhibidas:

// 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, como cualquier muestra notificaciones se eliminan también cuando estos métodos se llaman (gracias @ 0xced de aclaración).

+0

¿Estás seguro de que son iguales? ** Mostrado ** vs ** Entregado **. En 10.8, sus implementaciones no son lo mismo. (No he comprobado en 10.9) – 0xced

+0

Al menos con una prueba que realicé en 10.9, al llamar a '-removeAllDeliveredNotifications' eliminó todas las notificaciones que se mostraban actualmente. Supongo que no debe ser el comportamiento en 10.9. Editado para reflejar eso, gracias. –

1

removeDeliveredNotification está eliminando la notificación que se muestra para mí (el 10.11), la advertencia es el identifier en la notificación debe establecerse.

Cuestiones relacionadas