Programmieren mit Swift - Für macOS und iOS
Programmieren mit Swift - Für macOS und iOS
Growl einbinden, Teil 1

Bei Growl handelt es sich um ein Benachrichtigungssystem, mit dem unterschiedliche Programme dem Anwender Informationen über aktuelle Vorgänge mitteilen können. Diese Benachrichtigungen geschehen in der Regel über kleine Fenster, die vorübergehend auf dem Bildschirm eingeblendet werden. Aber auch eine Mitteilungen als Sprachausgabe oder als eMail ist möglich. Obwohl es nicht mit OS X ausgeliefert wird, ist Growl auf unzähligen Apple Computern zu finden und wird inzwischen von zahlreichen Programmen unterstützt.

Weitere Infos finden Sie unter http://www.growl.info

Die Beliebtheit und weite Verbreitung von Growl mag auch daran liegen, dass es sich sehr leicht in bestehende Cocoa Anwendung einbinden lässt. Wie es genau funktioniert, werden Sie in dieser Lektion erfahren. Natürlich muss Growl zuvor auf Ihrem System installiert sein. Ist dies geschehen, finden Sie es als weiteren Punkt in den Systemeinstellungen. Dort können Sie Growl auch konfigurieren, und zum Beispiel das Erscheinungsbild der Benachrichtigungsfenster festlegen.

Das erste Ziel soll es sein, einen in ein NSTextField eingegebenen Text in einem Growl Fenster als Nachricht darzustellen.

Erstellen Sie dafür ein neues Cocoa-Application Projekt, das Sie »GrowlTest« nennen und entwerfen Sie im Interface Builder ein Fenster mit den nötigen Steuerelementen. Ein NSTextField für die Eingabe und ein NSButton, um eine Action auszuführen, sind nötig. Ein weiteres Textfeld vom Typ Label dient zur Bezeichnung des Eingabefeldes, es ist für die Funktion der Anwendung aber nicht umbedingt notwendig.
stacks_image_1AAC5048-2B5A-4234-9DC9-25CFDC0C66D6
Erstellen Sie als nächstes wieder eine Objective-C Klasse, die als Controller für die Anwendung dient.
Die Headerdatei MyController.h erhält die für die Verbindung zum Interface Builder nötige Action und Outlet.
#import <Cocoa/Cocoa.h>

@interfaceMyController : NSObject {

IBOutletNSTextField *inputTextField;

}

- (
IBAction)clickSendGrowlMessage:(id)sender;

@end
In der Codedatei findet sich die Implementation diese Methode, die aber zunächst leer bleibt.
#import "MyController.h"

@implementationMyController

- (IBAction)clickSendGrowlMessage:(id)sender
{

}

@end

Erstellen Sie nun eine Instanz dieser Klasse im Interface Builder und verbinden Sie die Action und Outlet mit den richtigen Steuerelementen.

Um Growl in eines Ihrer Programme einzubinden, benötigen Sie als erstes eine Version des Growl Framework, welches Sie im Growl SDK finden und frei herunter laden können.

http://www.growl.info/documentation/developer/

Sie sollten den Framework-Ordner des Growl SDK als Unterordner in das Verzeichnis des aktuellen Projekts kopieren, in den gleichen Ordner, in dem sich auch die Projektdatei befindet. Dort ist das Framework am besten aufgehoben und man findet es schnell wieder. Um das Growl Framework anschliessend dem Projekt in Xcode hinzuzufügen sind mehrere Schritt nötig. Klicken Sie zunächst mit der sekundären Maustaste auf Ihr Projekt im Groups & Files Baum. Wählen Sie anschließend aus dem Menü Add und Existing Frameworks.
stacks_image_8EF297DA-669D-44FB-9B48-CE6F931478A1
In der Dateiauswahl selektieren Sie das Growl Framework.
stacks_image_C0BF401E-5E67-4BB2-BFCC-C81FDAF7E5C9
Jetzt ist das Growl-Framework zwar als Referenz in Ihrem Projekt, aber noch nicht in der zu erstellenden Anwendung. Um das zu erreichen sind ein paar weitere Schritte nötig.

Das aus dem Projekt zu erstellende Ergebnis, in den meisten Fällen ein Programm, wird in Xcode als Target dargestellt und das Framework muss in diesem Target eingebunden werden. Ein Projekt kann auch mehr als ein Target haben, zum Beispiel dann, wenn sie Variationen eines Programms erstellen möchten.

Klicken Sie mit der rechten Maustaste auf das Target in der Groups & Files Übersicht und wählen Sie Add -> New Build Phase -> New Copy Build Phase.
stacks_image_7A07A30F-2FA3-415C-87B5-748EE9D32728
In Eigenschaften wählen Sie Framework, aber keinen Pfad.
stacks_image_8D14778D-E103-462F-A7F0-E565CEDB9528
Jetzt finden Sie unter dem Target einen neuen Ordner für Dateien, die während des Erstellen dem Target hinzugefügt werden. Genau das soll auch mit dem Growl-Framework geschehen. Ziehen Sie deshalb die Referenz in diesen Ordner. Von jetzt an wird das Framework Teil der Anwendung.
stacks_image_F23DE536-58D8-49A4-9F26-8BDF14F795F1
Achtung: Auch in der Target-Gruppe »Link Binary with Libraries« muss das Framework vorhanden sein. In den meisten Fällen wird es automatisch dort hinzugefügt. Sollte das nicht passieren, müssen Sie es auch in diesen Ordner hinein ziehen.

Die gesamte Kommunikation mit Growl findet über die GrowlApplicationBridge statt, die durch das Framework jetzt zur Verfügung steht. Allerdings muss der Controller diese Klasse kennen, was aber durch eine #include-Anweisung leicht zu bewerkstelligen ist. Dort wird der komplette Pfad zur Headerdatei mit angegeben. Ebenso muss die Klasse das GrowlApplicationBridgeDelegate Protokoll implementieren. Kleine Erweiterung am Code der MyController.h sind nötig.
#import <Cocoa/Cocoa.h>
#import
"Growl/GrowlApplicationBridge.h"

@interfaceMyController : NSObject <GrowlApplicationBridgeDelegate>{

IBOutletNSTextField *inputTextField;

}

- (
IBAction)clickSendGrowlMessage:(id)sender;

@end
Als nächstes muss die Anwendung einen delegate bei Growl registrieren, denn Growl erlaubt Kommunikation in zwei Richtungen. Es ist nicht nur möglich über Growl Informationen darzustellen, ein Anklicken einer Meldung wird auch per Delegate an die Anwendung zurückgeführt. Diese Registrierung geschieht am besten in der awakeFromNib-Methode. Da Growl direkt mit der MyController-Klasse kommunizieren soll ist der delegate self.
-(void)awakeFromNib
{
    [GrowlApplicationBridge setGrowlDelegate:self];
}
Eine Methode, die Sie im delegate, also im Controller, implementieren müssen, ist registrationDictionaryForGrowl. Diese gibt ein NSDictionary zurück. Dieses Dictionary enthält zwei Listen, eine mit allen für diese Anwendung möglichen Nachrichten und eine Liste mit alle Nachrichten, die per default aktiviert sind. Für die meisten Programme sind diese Listen identisch.
- (NSDictionary*) registrationDictionaryForGrowl
{
    NSArray* defaults =
    [NSArray arrayWithObjects:
@"Test",@"Hallo",@"LogOn",@"LogOff", nil];

    NSArray* all =
    [NSArray arrayWithObjects:
@"Test",@"Hallo",@"LogOn",@"LogOff", nil];

    NSDictionary* growlRegDict = [NSDictionary dictionaryWithObjectsAndKeys:
     defaults, GROWL_NOTIFICATIONS_DEFAULT,all,
     GROWL_NOTIFICATIONS_ALL,
nil];

    return growlRegDict;
}
Wenn Sie das Programm jetzt starten, wird es sich bei Growl mit allen seinen möglichen Nachrichten registrieren. Das können Sie in den Systemeinstellungen für Growl überprüfen.
stacks_image_72BD9961-B306-4714-A58B-51AFCB7DA865
stacks_image_B9C414B7-7223-4D1F-A284-65A63E4E7947
Um eine Nachricht an Growl abzusenden ist nur ein einziger Befehl nötig. Die clickSendGrowlMessage-Methode war bisher leer, kann aber jetzt durch die Anweisung notifyWithTitle erweitert werden. Ein aus dem NSTextField eingelesene Zeichenkette wird als Nachricht an Growl gesendet. Die übrigen Parameter erlauben eine sehr umfangreiche Konfiguration.
- (IBAction)clickSendGrowlMessage:(id)sender
{
    [GrowlApplicationBridge notifyWithTitle:
@"Eine Nachricht"
                                       description:[inputTextField stringValue]
                                       notificationName:@"Hallo"
                                       iconData:nil
                                       priority:1
                                       isSticky:NO
                                       clickContext:nil];
}
Die Parameter setzten sich wie folgt zusammen:

* Titel: Die Überschrift der Nachricht
* Description: Der Text der Nachricht, hier aus einem NSTextField
* NotificationName: Der Name einer zuvor registrieren Nachricht
* IconData: Ein Icon
* Priority: Die Priorität der Nachricht
* isSticky: Bestimmt, ob sich die Nachricht automatisch ausblendet oder nicht
* ClickContext: Der Context wird beim Anklicken der Nachrichtenfensters an die Anwendung zurück gegeben.
stacks_image_F1615A87-5080-4C0E-904F-AF32EAC62757