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

Wird für ein NSUserNotification-Objekt die Eigenschaft deliveryDate gesetzt und die Nachricht anschließend mit scheduleNotification an die Mitteilungszentrale übergeben, ist es möglich, Nachrichten zeitverzögert anzuzeigen. So können Meldungen sogar dann angezeigt werden, wenn die absendende Anwendung bereits beendet wurde
// Mitteilung erst in 10 Sekunden anzeigen
notification.
deliveryDate = NSDate(timeIntervalSinceNow: 10)

// Benachrichtigung an das Nachrichtencenter übergeben.
var center = NSUserNotificationCenter.defaultUserNotificationCenter()
     center.scheduleNotification(notification)
Soll eine termingesteuerte Mitteilung vor ihrer Fälligkeit wieder gelöscht werden, funktioniert dies über den Aufruf von removeScheduledNotification. Allerdings muss man bei dieser Methode genau die NSUserNotification übergeben, die zuvor an die Mitteilungszentrale übergeben wurden. Hat man die Anwendung zwischenzeitlich beendet und neu gestartet, ist dies nicht ohne weiteres möglich. Glücklicherweise lassen sich alle im NSUserNotificationCenter hinterlegten Mitteilungen über die Eigenschaft scheduledNotifications abfragen. Mit einer Schleife und dem richtigen Vergleich ist es dann möglich, eine abgesendete Nachricht wieder zu finden und aus der Mitteilungszentrale zu entfernen.
var center = NSUserNotificationCenter.defaultUserNotificationCenter()

// Alle Mitteilungen dieser Anwendung holen
var notifications = center.scheduledNotifications;

for notification in notifications
{

    var
note = notification as NSUserNotification
    if
note.title == "Überschrift"
    {
        // Mitteilung wieder entfernen
        center.removeScheduledNotification(note)

        break
;
    }
}
Sofern die Anwendung beim Zustellen der Nachricht noch läuft, kann dieses Ereignis im Programmcode leicht überprüft werden. Das zum Delegate des NSUserNotificationCenter bestimmt Objekt erhält eine userNotificationCenter didDeliverNotification-Nachricht, bei der auch die Mitteilung als Parameter mit übergeben wird. Diese Methode wird aufgerufen, bevor die Nachricht zur Anzeige gebraucht wird. Setzten Sie im Code einen Haltepunkt und Sie werden das Mitteilungsfenster erst sehen, wenn der Programmablauf die Methode wieder verlassen hat.
func userNotificationCenter(center: NSUserNotificationCenter!,
didDeliverNotification notification:
NSUserNotification!)
{

    println
("Zugestellt: \(notification.title)");
}
Soll ein Programm selbst bestimmen, ob es seine Mitteilungen im Stil Hinweis mit zwei Schaltflächen und nicht als Banner anzeigt, muss in der info.plist des Projektes der Schlüssel NSUserNotificationAlertStyle mit dem Wert alert eingefügt werden. Allerdings hat diese Konfiguration nur bei Code-signierten Anwendung tatsächlich Auswirkungen.
stacks_image_A6ECA366-85A6-4828-952B-8C4F07D19B93
Die Beschriftungen der Button können dann aus dem Code verändert werden.
notification.hasActionButton = true
notification.
otherButtonTitle = "Schließen"
notification.
actionButtonTitle = "Aktion"
Durch Anklicken des otherButton wird die Mitteilung nur geschlossen, wohingegen der action Button zusätzliche eine Nachricht zurück an die Anwendung schickt. Diese kann dort durch die Methode userNotificationCenter didActivateNotification entgegengenommen werden.
func userNotificationCenter(center: NSUserNotificationCenter!,
didActivateNotification notification:
NSUserNotification!)
{

    NSBeep
()
}
stacks_image_EC4BFD4C-FF9A-46C4-9888-05D0F7CA48DB
Der Aufruf von userNotificationCenter didActivateNotification funktioniert allerdings nur, wenn die Anwendung zum Zeitpunkt des Anklickens noch ausgeführt wird. Ist das nicht der Fall, wird das Programm automatisch neu gestartet und die Mitteilung an applicationDidFinishLaunching mit übergeben. Über den Schlüssel NSApplicationLaunchUserNotificationKey kann die NSUserNotification aus dem userInfo-Dictionary der NSNotification ermittelt werden.
func applicationDidFinishLaunching(aNotification: NSNotification?)
{

    if let note = aNotification
    {

   
    var userDict = note.userInfo as NSDictionary
        var
obj:(AnyObject!) =
        userDict.
objectForKey("NSApplicationLaunchUserNotificationKey")

        if let userNotification = obj as? NSUserNotification
        {

       
    if userNotification.title == "Überschift"
            {
                NSBeep()
       
    }
   
    }
    }

    // Delegate für die Mitteilungszentrale setzten

    var
center =
     NSUserNotificationCenter
.defaultUserNotificationCenter()
    center.
delegate = self
}
Wird für ein NSUserNotification-Objekt die Eigenschaft hasReplyButton auf true gesetzt, erhält die Mitteilung statt des actionButton eine Schaltfläche mit der Beschriftung Antworten.
stacks_image_2FFB3E91-BDB3-40B3-9AC3-49F71C81A9D7
So bekommt der Anwender die Möglichkeit, direkt über die Mitteilung Informationen an das Programm zurück zu geben. Der eingegeben Text ist dann ebenfalls Teil der Mitteilung, die an die Anwendung gesendet wird, und kann über die Eigenschaft response.string ausgelesen werden. Über den activationType kann man sogar ermitteln, auf welchem Weg die Methode aufgerufen wurde, falls die Anwendung verschiedene Typen von Mitteilungen implementiert.
stacks_image_66E75D66-E247-42B4-8FB3-3BDE2E6ADCFF
func userNotificationCenter(center: NSUserNotificationCenter!,
didActivateNotification notification:
NSUserNotification!)
{
    if notification.activationType == NSUserNotificationActivationType.Replied
    {

        println
("Reply: \(notification.response.string)")
    }
}