19

Ich versuche, das neue Mountain Lion NSUserNotificationCenter für meine Anwendung zu verwenden (was eigentlich nicht zu schwer ist). wie ein Zauber würde ich jedoch gerne überNSUserNotificationCenter Kündigungsbenachrichtigung

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

[[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:userNotification]; 

arbeitet Meldungen der Veröffentlichung alle Benachrichtigungen schließen, die auf dem Bildschirm, sobald die App den Fokus erhält. Z.B. wie die neue Nachrichten App es tut. Wenn neue Nachrichten im Hintergrund empfangen werden, werden Benachrichtigungen angezeigt. Wenn die App wieder aktiv wird, werden diese automatisch ausgeblendet und verschwinden vom Bildschirm und von der Benachrichtigungszentrale.

Um dies zu replizieren, habe ich eine Methode auf die NSApplicationDidBecomeActiveNotification Benachrichtigung registriert, die auch erfolgreich aufgerufen wird. Dort rufe ich [NSUserNotificationCenter defaultUserNotificationCenter] removeAllDeliveredNotifications] an.

Dies hat jedoch zur Folge, dass Benachrichtigungen, die in der Benachrichtigungszentrale gesammelt wurden, entfernt werden, während die entsprechenden "Bubbles", die in der oberen rechten Ecke angezeigt werden, weiterhin angezeigt werden.

Das Iterieren aller ausgelieferten Benachrichtigungen und das Entfernen jeder einzelnen davon hat genau den gleichen Effekt wie die Verwendung von scheduleNotification anstelle von deliverNotification.

Bin ich der einzige, der dies erlebt, oder fehlt mir etwas, um den Bildschirmteil und den Mitteilungs-Teil einer Benachrichtigung programmatisch zu verwerfen?

+0

Klingt, dass Sie dies lieber als Fehler auf http://bugreport.apple.com melden sollten. –

+0

Schon getan. Nicht, dass irgendjemand bei Apple sie wirklich liest, denke ich, aber nur um der Vollständigkeit willen. Ich bin mir nicht sicher, ob ich hier etwas verpasse und es ist ein Fehler auf meiner Seite. – BinaryBucks

+0

In welchem ​​Kontext verwenden Sie die Benachrichtigungen, müssen Sie überhaupt die "Blasen" haben? –

Antwort

17

Die App Nachrichten verwendet wahrscheinlich die private Methode NSUserNotificationCenter _removeAllDisplayedNotifications oder _removeDisplayedNotification:.

Sie können versuchen, diese Methoden zu verwenden, um zu testen, ob dies das ist, wonach Sie suchen. Fügen Sie einfach diese Kategorie Schnittstelle, die Methoden zu erklären:

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

Leider, da diese nicht dokumentierte Methoden sind, können Sie sie nicht in einer App über den App Store vertrieben nutzen können. Wenn dies in der Tat das ist, was Sie suchen, dann sollten Sie file a bug und fragen Sie nach diesen Methoden, um Teil der öffentlichen API zu werden.

+0

Die Verwendung dieser privaten Methoden funktioniert tatsächlich, danke. Ich habe keine Ahnung, warum solche Methoden nicht Teil der öffentlichen API tbh sind. Ich werde einen Fehlerbericht dafür einreichen. – BinaryBucks

3

Ab 10.9 die folgenden Verfahren entfernen Sie alle Benachrichtigungen angezeigt:

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

Das Verhalten seit 10.8 geändert zu haben scheint, wie alle Benachrichtigungen als auch entfernt werden angezeigt, wenn diese Methoden aufgerufen werden (Danke @ 0xced für Klärung).

+0

Sind Sie sicher, dass sie gleich sind? ** Angezeigt ** vs ** Geliefert **. In 10.8 sind ihre Implementierungen nicht identisch. (Ich habe nicht auf 10.9 überprüft) – 0xced

+0

Zumindest mit einem Test, den ich am 10.9 durchgeführt, entfernt Aufruf von '-removeAllDeliveredNotifications' alle Benachrichtigungen, die gerade angezeigt wurden. Ich denke, das muss nicht das Verhalten am 10.9 sein. Bearbeitet, um das zu reflektieren, danke. –

1

removeDeliveredNotification entfernt die angezeigte Benachrichtigung für mich (am 10.11), der Vorbehalt ist die identifier auf der Benachrichtigung muss eingestellt werden.