19

Sto provando a utilizzare il nuovo NSUserNotificationCenter di Mountain Lion per la mia applicazione (che in realtà non è troppo difficile). Distacco notifiche funziona come un fascino tramiteNSUserNotificationCenter notifica di annullamento

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

[[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:userNotification]; 

Tuttavia, mi piacerebbe eliminare tutte le notifiche che si trovano sullo schermo una volta che i guadagni app si concentrano. Per esempio. come la nuova app Messaggi lo fa. Quando vengono ricevuti nuovi messaggi in background, vengono visualizzate le notifiche. Quando l'app diventa nuovamente attiva, questi vengono automaticamente ignorati e svaniscono dallo schermo e dal Centro notifiche.

Per replicare questo, ho registrato un metodo per la notifica NSApplicationDidBecomeActiveNotification che viene anche chiamata con successo. Lì chiamo [NSUserNotificationCenter defaultUserNotificationCenter] removeAllDeliveredNotifications].

Questo, tuttavia, ha l'effetto che le notifiche che sono state raccolte nel Centro di notifica vengono rimosse mentre le corrispondenti "bolle" visualizzate nell'angolo in alto a destra sono ancora visualizzate.

L'iterazione di tutte le notifiche consegnate e la rimozione di ciascuna di esse ha lo stesso effetto, poiché è stato utilizzato scheduleNotification anziché deliverNotification.

Sono l'unico a sperimentare questo, o mi manca qualcosa per eliminare la parte sullo schermo e il Centro di notifica parte di una notifica programmaticamente?

+0

Sembra che si dovrebbe piuttosto segnalare questo come un bug su http://bugreport.apple.com. –

+0

Già fatto. Non che qualcuno di Apple li legge effettivamente, credo, ma solo per il completamento. Non sono sicuro se non mi manchi qualcosa qui ed è un errore dalla mia parte però. – BinaryBucks

+0

In quale contesto si stanno utilizzando le notifiche, è necessario avere le "bolle"? –

risposta

17

L'app Messaggi utilizza probabilmente il metodo NSUserNotificationCenter _removeAllDisplayedNotifications o privato.

È possibile provare a utilizzare questi metodi per verificare se questo è ciò che si sta cercando. Basta aggiungere questa interfaccia categoria a dichiarare i metodi:

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

Purtroppo, dal momento che questi sono metodi non documentati, non è possibile utilizzarli in un'applicazione distribuita attraverso l'App Store. Se questo è davvero quello che stai cercando, allora devi file a bug e chiedere che questi metodi diventino parte dell'API pubblica.

+0

L'utilizzo di questi metodi privati ​​funziona davvero, grazie. Non ho idea, perché tali metodi non fanno parte dell'API pubblica tbh. Presenterò una segnalazione di bug per questo. – BinaryBucks

3

Al 10.9, i seguenti metodi rimuovono qualsiasi visualizzato notifiche:

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

Il comportamento sembra aver cambiato da 10,8, come qualsiasi visualizzate notifiche vengono rimossi anche quando questi metodi vengono chiamati (grazie @ 0xced per una precisazione).

+0

Sei sicuro che siano uguali? ** Visualizzato ** vs ** consegnato **. Il 10.8, le loro implementazioni non sono le stesse. (Non ho controllato il 10.9) – 0xced

+0

Almeno con un test eseguito su 10.9, chiamando '-removeAllDeliveredNotifications' sono state rimosse tutte le notifiche attualmente visualizzate. Immagino che non debba essere il comportamento su 10.9. Modificato per riflettere questo, grazie. –

1

removeDeliveredNotification sta rimuovendo la notifica visualizzata per me (il 10.11), è necessario impostare l'avvertenza identifier sulla notifica.