Programmieren mit Swift - Für macOS und iOS
Programmieren mit Swift - Für macOS und iOS
NSUserNotification

Seit OS X 10.8 Mountain Lion haben auch Entwickler von Desktop-Anwendungen die Möglichkeit, Ihre Nutzer durch Mitteilungen auf dem Bildschirm zu informieren. Ähnlich wie unter iOS werden diese Nachrichten zunächst in einem kleinen Fenster angezeigt und anschließend in der Mitteilungszentrale verwaltet. Die Mitteilungszentrale kann über das Symbol ganz recht in der Menüleiste oder über eine Geste auf Trackpad geöffnet werden.
stacks_image_96653E6F-F243-45D5-8C4B-34495F17A091
Die Konfiguration und Zustellung einer solchen Mitteilung ist sehr einfach. Zunächst benötig man ein Objekt der Klasse NSUserNotification, dem Zeichenketten für die Eigenschaften title und informativeText zugewiesen werden. Dies sind die Überschrift und der Text der anzuzeigenden Nachricht. Soll mit der Anzeige auch ein akustische Signal abgespielt werden, muss die Eigenschaft soundName gesetzt werden, wobei vom Framework nur der Wert NSUserNotificationDefaultSoundName angeboten wird. Anschließend muss die Benachrichtigung nur noch an die Mitteilungszentrale übergeben werden und die Arbeit ist getan.
- (IBAction)buttonClicked:(id)sender
{
    // Eine Benachrichtigung erzeugen
    NSUserNotification *notification
    = [[NSUserNotification alloc] init];
    notification.title = @"Überschrift";
    notification.informativeText
     = @"Dies ist eine Benachrichtigung mit NSUserNotification";
    notification.soundName = NSUserNotificationDefaultSoundName;
   
    // Benachrichtigung an das Nachrichtencenter übergeben.
    [[NSUserNotificationCenter defaultUserNotificationCenter]
    deliverNotification:notification];
}
Bevor Ihre Anwendung Mitteilungen anzeigen kann, sind allerdings einige weitere Schritte zur Konfiguration nötig. Zunächst muss die Anwendung zu Erkennen geben, ob von ihr überhaupt Mitteilungen angezeigt werden sollen. Das geschieht über den Rückgabewert der Methode userNotificationCenter: ShouldPresentNotification:.
- (BOOL)userNotificationCenter:(NSUserNotificationCenter *)center
  shouldPresentNotification:(NSUserNotification *)notification
{
    return YES;
}
Der Rückgabewert der Methoden kann durchaus variable sein, so dass sich das Verhalten der Anwendung zur Laufzeit ändert. Beispielsweise könnte der Nutzer in den Programmeinstellungen auswählen, ob er Mitteilungen bekommen möchte oder nicht.
Damit die Methode allerdings überhaupt aufgerufen wird, muss im Programm ein Objekt zum Delegate von NSUserNotificationCenter bestimmt werden. Sehr gut eignet sich dafür der Controller der Anwendung, für gewöhnlich die Klasse AppDelegate. In der applicationDidFinishLaunching:-Methode kann die Zuweisung des Delegate dann auch direkt vorgenommen werden.
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Delegate für die Mitteilungszentrale setzten
    [[NSUserNotificationCenter defaultUserNotificationCenter]
    setDelegate:self];
}
Nachdem dieser Befehl implementiert wurde, kann die Anwendung endlich Mitteilungen anzeigen. Allerdings wird der Compiler noch eine Warnung ausgeben, denn wo immer Delegation verwendet wird, gibt es in der Regel ein Protokoll, mit dem die Nachrichten und Methodensignaturen festgelegt werden. Im Header der Klasse sollte sich AppDelegate daher verpflichten, das NSUserNotificationCenterDelegate-Protokoll umzusetzen. Dann lässt sich das Projekt ohne weitere Warnungen kompilieren.
@interface AppDelegate : NSObject <NSApplicationDelegate,  NSUserNotificationCenterDelegate>
stacks_image_DBFDE7A6-4413-49D1-B07C-1D380E921909
Falls Sie Ihre Mitteilung nur in der Mitteilungszentrale, aber nicht als Fenster auf dem Desktop bekommen, habe Sie möglicherweise die „Nicht stören“ Funktion in den Systemeinstellungen aktiviert.
stacks_image_2E116C7C-8267-4776-BCC6-405D09C3D086
Wählen Sie Ihr Programm aus der Liste der Anwendungen und Sie können auch noch weitere Einstellungen konfigurieren. Wenn Sie Mitteilungen im Stil Hinweis anzeigen lassen, wird jedes Mitteilungsfenster um zwei Schaltflächen erweitert und die Meldung bleibt sichtbar, bis einer der beiden Button ausgewählt wurde.
stacks_image_B7DCDA11-3604-4680-B281-E86A7AF4D4AA
Möchten Sie ein anderes akustisches Signal mit der Mitteilung abspielen, können Sie die Systemklänge ganz einfach über deren Namen zuweisen. Die aktuell zur Verfügung stehenden Signale sind Basso, Bottle, Funk, Hero, Ping, Purr, Submarine, Blow, Ping, Glas, Morse, Pop, Sosumi und Tink.
notification.soundName = @"Basso";