# Application Bundle

Bei einem Application Bundle unter NeXTSTEP und deren Nachfolger wie macOS oder iOS handelt es sich um ein Paket bzw. Bundle, das unter diesen Betriebssystemen für Applikationen gedacht ist. Technisch gesehen handelt es sich dabei um einen Ordner, der eine bestimmte vorbestimmte Struktur sowie eine bestimmte Dateinamenserweiterung vorweisen muss. In diesem Fall ist die Dateinamenserweiterung „app“. Der Dateiname einer entsprechenden Applikation setzt sich also aus dem Namen der Applikation sowie „.app“ zusammen.
Unter macOS wird innerhalb des Finders, dem integrierten Dateiexplorer sowie allen auf dem Finder basierenden Modulen, wie z. B. Datei- oder Ordnerdialogen, ein Application Bundle in erster Linie als einzelnes Item bzw. Datei behandelt, statt als Ordner. Beim Öffnen dieses Bundles wird, nicht wie bei einem Ordner üblich, dessen Inhalt im Finder dargestellt, sondern eine bestimmte Datei innerhalb des Bundles ausgeführt. Diese liegt im Ordner „/Contents/MacOS“. Ihr Name ist individuell von jeder Applikation abhängig und wird in der Datei „Info.plist“ festgelegt.
Über die Aktion „Paketinhalt anzeigen“ im Kontextmenü bietet der Finder die Möglichkeit, das Application Bundle als normalen Ordner zu behandeln und dementsprechend anzuzeigen.

## Struktur

Die Ordner- bzw. Dateistruktur eines Application Bundles sieht in ihrer minimalen Form wie folgt aus:

### Executable

Die Datei „Info.plist“ innerhalb des Ordners „Contents“ ist dabei unabdingbar, da sie Informationen über die Applikation enthält, so zum Beispiel auch den Dateinamen der Datei, die bei einem Öffnen im Finder (und dementsprechend auch in anderen Stellen in macOS) standardmäßig ausgeführt wird. Bei der Info.plist handelt es sich um eine normale Property List. Der entsprechende Key lautet „CFBundleExecutable“ und enthält einen String mit dem Dateinamen der auszuführenden Datei relativ zum Ordner „MacOS“ im Bundle. Diese Datei kann grundsätzlich jede auszuführende Datei sein, sofern das System weiß, wie es sie auszuführen hat. Exakt diese Datei ist daher auch das tatsächliche Programm. Ihre Ausführung auf normalem Weg würde die Applikation in gleicher Weise starten, mit dem Unterschied, dass bei der Ausführung einer Binärdatei auf „normalem“ Weg unter macOS häufig eine Konsole geöffnet wird, welche die Ausgaben ebendieser Applikation anzeigt. In den meisten Fällen wird es sich dabei um eine Binärdatei handeln, aber auch Skripte in Python, Node.js oder Ruby können dort aufgezeigt werden, sofern das entsprechende Skript im Ordner „macOS“ liegt und ausführbar ist sowie die entsprechende Runtime installiert ist.

### Optionale Struktur

Häufig enthält ein Application Bundle innerhalb von „Contents“ noch andere Ordner oder Dateien, wie „Resources“, „Frameworks“, „PlugIns“ oder „_CodeSignature“. Besonders wichtig ist dabei der Ordner „Resources“, der in nahezu jeder macOS Applikation vorhanden ist, da er Ressourcen für das Programm enthält. So unter anderem häufig die Icon-Datei für das Application Bundle, da der in der „Info.plist“ anzugebende Dateiname der Icon-Datei sich relativ zum Ordner „Resources“ verhält.
Eine realistische Dateistruktur eines App Bundles sieht also wie folgt aus:

#### Resources

Der Ordner Resources enthält in der Regel alle für die Anwendung Seiten des Endnutzers wichtige Daten wie Bilder, .nip-Dateien, .help-Dateien, Sounds, Videos, Skripte und vieles mehr.

#### Frameworks

Der Ordner Frameworks enthält alle macOS Frameworks die die Applikation mitliefert. Dabei handelt es sich meistens um „.framework“-Dateien, die auch wiederum Bundles bzw. Pakte unter macOS sind.

#### _CodeSignature

Informationen zu Zertifikaten und Signaturen der Applikation um macOS interne Authentifizierung des Entwicklers zu ermöglichen.

## Funktionsweise

Ein Application Bundle wird vom Finder dann als solches erkannt und dementsprechend behandelt, wenn bestimmte Kriterien erfüllt sind:
* Die Struktur muss die Grundvoraussetzungen erfüllen.
* Der Ordner muss die Dateinamenserweiterung „app“ enthalten.
* Die „Info.plist“ Datei im „Contents“ Ordner muss bestimmte Grundinformationen zur App beinhalten, darunter z. B. die Executable, Informationen über den Autor und einige mehr. Sind bestimmte Informationen unvollständig oder falsch, gilt die Anwendung beim Öffnen im Finder als „Beschädigt“, ein entsprechendes Dialogfenster weist darauf hin.

### Icon

Das im Finder sowie im Dock angezeigte Icon wird normalerweise aus dem Key „CFBundleIconFile“ der „Info.plist“ Datei genommen. Ist dieser nicht vorhanden, wird das Icon des Ordners des Application Bundles genommen. Ist dieses auch nicht existent, wird das standardmäßige Application-Icon von macOS verwendet.

### Info.plist

Die Property List „Info.plist“ ist unabdingbar für die Funktion einer Applikation unter macOS. Sie enthält folgende wichtige Informationen:
| Key | Funktion |
| CFBundleDisplayName | Name der Anwendung für die macOS-UI |
| CFBundleExecutable | Auszuführende Datei beim Öffnen |
| CFBundleIconFile | Icon-Datei |
| CFBundleIdentifier | Applikation Identifier |
| CFBundleName | Kurzer Name der Anwendung |
| CFBundlePackageType | Typ des Bundles (APPL) |
| LSApplicationCategoryType | Kategorie der Anwendung |
| LSMinimumSystemVersion | Minimale benötigte Version von macOS |