Grundlegende Verwendung

XCConfig ist eine Möglichkeit, Xcode-Build-Settings in externe Dateien auszulagern.

Build-Settings lassen sich im folgenden Format auflisten:

BUILD_SETTING_NAME = value

Auch bedingte Werte sind möglich:

ONLY_ACTIVE_ARCH[config=Debug][sdk=*][arch=*] = YES

In Swift greift man so auf den Wert zu:

let object = Bundle.main.object(forInfoDictionaryKey:key)

Konfiguration und Code trennen

Manche Apps speichern Konfiguration als Konstanten im Code. Das verstößt gegen Twelve-Factor, das eine strikte Trennung von Konfiguration und Code verlangt. Konfiguration unterscheidet sich erheblich zwischen Deployments, Code nicht.

Schlecht

Der folgende Code enthält konstante Werte direkt im Code.

import Foundation
 
#if DEBUG
let apiBaseURL = URL(string: "https://api.staging.example.com")!
#else
let apiBaseURL = URL(string: "https://api.example.com")!
#endif

Das ist ein gängiges Muster, wenn man je Umgebung unterschiedliche Werte verwendet — Konfiguration per Code. In diesem Beispiel ist apiBaseURL nur ein einzelner Wert, aber der Code ist komplizierter als nötig. Mit XCConfig muss man den gesamten Code oben gar nicht erst schreiben.

Gut

Angenommen, es gibt zwei XCConfigs: Debug.xcconfig und Release.xcconfig.

API_BASE_URL = api.staging.example.com
API_BASE_URL = api.example.com

In Swift holt man sich den Wert einfach und verwendet ihn:

guard let url = Bundle.main.object(forInfoDictionaryKey:"API_BASE_URL") else {
    return
}
 
URLSession...

Der Code bleibt in allen Umgebungen gleich, nur der Wert ändert sich je nach Umgebung.

Wichtige Hinweise

XCConfig-Dateien sind öffentliche Dateien, genau wie Header-Dateien. Sie sind im Binary-Package sichtbar. Man darf dort niemals Credentials oder vertrauliche Informationen ablegen.

Umgang mit geheimen Werten

Als allgemeiner Rat: Verwendet keine xcconfig-Dateien, um Secrets wie API-Keys oder andere Credentials zu speichern.

Wenn ihr trotzdem unbedingt geheime Werte in XCConfig verwalten müsst, geht das — indem ihr die XCConfig-Dateien nicht ins VCS (git, subversion etc.) eincheckt.

In der .gitignore (falls ihr git verwendet):

path/to/Release.xcconfig
path/to/Debug.xcconfig

Auf die Werte könnt ihr weiterhin über die Bundle-API zugreifen. Das funktioniert ähnlich wie .env.

Referenzen