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_9305DF7B-850E-419D-9E2C-1CFCD277A6DC
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 zusätzlich die Eigenschaft soundName gesetzt werden, wobei vom Framework allerdings nur der Wert NSUserNotificationDefaultSoundName angeboten wird. Anschließend muss die Benachrichtigung nur noch an die Mitteilungszentrale übergeben werden und die Arbeit ist getan.
@IBAction func buttonClicked(sender: AnyObject)
{
    // Eine Benachrichtigung erzeugen

    var
notification = NSUserNotification();
    notification.
title = "Überschift"
    notification.
informativeText
     = "Dies ist eine Benachrichtigung mit NSUserNotification"
     notification.soundName = NSUserNotificationDefaultSoundName

    // Benachrichtigung an das Nachrichtencenter übergeben.

    var
center =
     NSUserNotificationCenter
.defaultUserNotificationCenter()
     center.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.
func userNotificationCenter(center: NSUserNotificationCenter!,
shouldPresentNotification notification:
NSUserNotification!) -> Bool
{

    return
true
}

Der Rückgabewert der Methode 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.
func applicationDidFinishLaunching(aNotification: NSNotification?)
{
    // Delegate für die Mitteilungszentrale setzten

    var
center =
     NSUserNotificationCenter
.defaultUserNotificationCenter()
     center.
delegate = 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 Methodensignaturen festgelegt werden. Die Klasse AppDelegate sollte sich daher verpflichten, das NSUserNotificationCenterDelegate-Protokoll umzusetzen. Dann lässt sich das Projekt ohne weitere Warnungen kompilieren.
class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDelegate {
stacks_image_423248F1-8A41-4FFB-AD00-8B13BCC2E759
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_C24FCED1-4A54-4100-B6AB-5C85A1D605D8
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_5EE1BFDA-28E6-4C90-8C5B-23A4D03DB628
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"