Info.plist Basics für React-Native Entwickler
Tags: reactnative, ios, mobiledevtips, iosappconfig
Published: 2024-01-21 13:15:58

## Einleitung

[React Native](https://reactnative.dev/) ist ein auf _JavaScript_ basierendes Hybrid-Framework zur Entwicklung von nativen Apps auf _iOS_ und _Android_. Es macht es Web-Entwicklern einfach den Umstieg zur App-Entwicklung zu finden, da die meißten mit -JavaScript* oder sogar \_React* vertraut sein dürften. Schwierig wird es allerdings, wenn es um die Benutzung von Build-tools, wie bsp. [Gradle](https://gradle.org/) oder der Verwendung der nativen Konfigurationsdateien wie der _AndroidManifest.xml_ oder der _Info.plist_ geht. Letztere Datei, die in jedem iOS-Projekt zu finden ist, spielt eine entscheidende Rolle bei der Definition von App-Einstellungen und Berechtigungen. In diesem Artikel wird erläutert, was die _Info.plist_-Datei ist und wie man sie effektiv nutzen kann.

## Was ist die _Info.plist_-Datei?

Die _Info.plist_ (Information Property List) ist eine Konfigurationsdatei im [XML](https://developer.mozilla.org/en-US/docs/Web/XML/XML_introduction?retiredLocale=de)-Format, die wichtige Informationen über eine _iOS_-App enthält. Sie definiert Eigenschaften wie den App-Namen, Versionsnummer, Berechtigungen und vieles mehr. [Xcode](https://developer.apple.com/xcode/) liest diese Datei, um wichtige Informationen eine App zu erhalten.

## Warum ist _Info.plist_ für React Native-Entwickler wichtig?

Das Bearbeiten der _Info.plist_-Datei ist oft notwendig, um:

- App-Berechtigungen festzulegen (z.B. Kamerazugriff, Standortdienste).
- App-Metadaten wie Version, Anzeigename und unterstützte Geräteorientierungen zu definieren.
- Externe Dienste zu integrieren, wie z.B. Push-Benachrichtigungen.

## Anpassen der _Info.plist_

### Zugriff auf die Datei

Die _Info.plist_-Datei befindet sich unter _ios/[Projektname]/Info.plist_.

### Definition von App-Metadaten

Wichtige Keys für Metadaten sind bsp.:

- **`CFBundleDisplayName` (Anzeigename der App)**:
  Bestimmt den Namen der App, der auf dem Homescreen des Geräts angezeigt wird.
- **`CFBundleShortVersionString` (Versionsnummer)**:
  Die öffentliche Versionsnummer der App, die im App Store angezeigt wird, z.B. 1.6.9.
- **`CFBundleVersion` (Build-Versionsnummer)**:
  Interne Versionsnummer, die zur Unterscheidung von Builds innerhalb einer Version verwendet wird. Diese Zahl ist aufsteigend, z.B. 96.

### Usage Descriptions

Usage Descriptions (Nutzungsbeschreibungen) in _iOS_ sind erforderlich, um dem Benutzer den Zweck der Anforderung bestimmter Berechtigungen zu erklären:

- **`NSCameraUsageDescription` (Kamerazugriff**):

  ```xml
<key>NSCameraUsageDescription</key>
<string>Diese App benötigt Zugriff auf Ihre Kamera, um Fotos aufzunehmen.</string>
  ```

- **`NSMicrophoneUsageDescription` (Mikrofonzugriff)**:

  ```xml
<key>NSMicrophoneUsageDescription</key>
<string>Diese App benötigt Zugriff auf Ihr Mikrofon, um Sprachaufnahmen zu ermöglichen.</string>
  ```

- **`NSLocationWhenInUseUsageDescription` und `NSLocationAlwaysUsageDescription` (Standortdienste)**:

  ```xml
<key>NSLocationWhenInUseUsageDescription</key>
<string>Diese App benötigt Ihren Standort, um standortbezogene Dienste anzubieten.</string>
  ```

- **`NSPhotoLibraryUsageDescription` (Fotobibliothekszugriff)**:

  ```xml
<key>NSPhotoLibraryUsageDescription</key>
<string>Diese App benötigt Zugriff auf Ihre Fotos, um Bilder hochzuladen.</string>
  ```

- **`NSContactsUsageDescription` (Kontaktezugriff)**:
  ```xml
<key>NSContactsUsageDescription</key>
<string>Diese App benötigt Zugriff auf Ihre Kontakte, um die Integration zu erleichtern.</string>
  ```

### App Transport Security (ATS)

**ATS (`NSAppTransportSecurity`)** ist eine Sicherheitsfunktion in _iOS_, die standardmäßig sicherstellt, dass alle HTTP-Verbindungen, die von der App verwendet werden, HTTPS sind. Standardmässig sieht der Eintrag wie folgt aus:

```xml
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>localhost</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>
```

Unter `NSExceptionDomains` können Ausnahmen für spezifische Domains definiert werden, für die die ATS-Regeln nicht gelten sollen. Für die App-Entwicklung gibt es standardmässig einen Eintrag für [localhost](https://en.wikipedia.org/wiki/Localhost), damit mit der App kommuniziert werden kann.
`NSExceptionAllowsInsecureHTTPLoads` mit dem Wert `true` bedeutet, dass für Verbindungen zu localhost unsichere HTTP-Verbindungen erlaubt sind, anstatt HTTPS zu erzwingen. Ansonsten könnten lokal genutzte Dienste (z.B. ein Dev-server) auch nur mit https genutzt werden, was die Einrichtung eines [SSL-Zertifikates](https://www.heise.de/tipps-tricks/SSL-Zertifikat-Was-ist-das-4862296.html) erfordern würde.

Läuft eine App hinter einem VPN, kann es oft notwendig sein, den Server an dieser Stelle einzutragen und die Ausnahmen korrekt zu konfigurieren.

### App-Icons, Launch-Screens und Orientierungen

- **`CFBundleIcons` (App-Icons)**:
  Bestimmt die Icons, die für die App verwendet werden. In der Regel werden die Icons als Asset-Katalog in Xcode konfiguriert und nicht direkt in der _Info.plist_-Datei.
- **`UILaunchStoryboardName` oder `UILaunchImages` (Launch-Screen)**:
  Definiert die Launch-Screen-Datei oder die Bilder, die beim Starten der App angezeigt werden. Auch hier ist die übliche Methode die Verwendung eines Storyboards oder eines Asset-Katalogs.
- **`UISupportedInterfaceOrientations` (Orientierungen)**:

  Legt fest, welche Bildschirmorientierungen die App unterstützt.
  Beispiel für Portrait und Landscape:

  ```xml
  <key>UISupportedInterfaceOrientations</key>
  <array>
      <string>UIInterfaceOrientationPortrait</string>
      <string>UIInterfaceOrientationLandscapeLeft</string>
      <string>UIInterfaceOrientationLandscapeRight</string>
  </array>
  ```

## Schluß

Die _Info.plist_-Datei ist ein wichtiges Element in der _iOS_-Entwicklung. Ein tiefes Verständnis dieser Datei ermöglicht es Entwicklern, ihre Apps effektiv für _iOS_ zu konfigurieren und anzupassen. Dies ist für eine erfolgreiche Einreichung im Apple App Store unerlässlich, denn eine Ablehnung der App kann schwerwiegende Folgen wie eine unzufriedene Userbase nach sich ziehen.