In Objective-C
war es manchmal nützlich statische String - Konstanten zu verwenden alternative API Schlüssel definieren (beispielsweise zur Unterscheidung zwischen RELEASE und DEBUG Schlüssel für die Analytik von Paketen wie MixPanel, Flurry oder Crashlytics):
#if DEBUG
static NSString *const API_KEY = @"KEY_A";
#else
static NSString *const API_KEY = @"KEY_B";
#endif
und dann...
[Analytics startSession:API_KEY];
Wie übersetzt sich dies in Swift, da der Swift-Compiler keinen Präprozessor mehr verwendet?
quelle
=1
... Ich habe ein bisschen Zeit verloren, um herauszufinden, warum es nicht funktioniert als ich es tat. Also dachte ich, ich würde diesen Leckerbissen teilen, um dem nächsten Kerl zu helfen. :] Trotzdem danke für deine Antwort hier!DEBUG
inActive Compilation Conditions
als auchDEBUG=1
in gesetztPreprocessor Macros
und diese Konfiguration funktioniert überhaupt nicht. Soll ich entfernenDEBUG=1
? Aus den obigen Kommentaren nicht klar.Build Configuration
. Überprüfen Sie diese Antwort stackoverflow.com/questions/9063100/… für weitere Informationen.AKTUALISIERT: Xcode 8 unterstützt dies jetzt automatisch, siehe Antwort von @ DanLoewenherz oben.
Vor Xcode 8 konnten Sie Makros noch auf die gleiche Weise verwenden:
Damit sie jedoch von Swift aufgenommen werden können, müssen Sie in den Build-Einstellungen Ihres Ziels "Andere Swift-Flags" festlegen:
-D
Flag vorangestellt istquelle
-D
PräfixVersuchen Sie als Folgebeobachtung, API-Schlüssel / Geheimnisse nicht im Klartext im Repository zu speichern. Verwenden Sie ein Geheimnisverwaltungssystem, um die Schlüssel / Geheimnisse in die Umgebungsvariablen des Benutzers zu laden. Andernfalls ist Schritt 1 erforderlich, falls akzeptabel.
../set_keys.sh
Liste mitexport API_KEY_A='<plaintext_key_aef94c5l6>'
(verwenden Sie ein einfaches Anführungszeichen, um eine Bewertung zu verhindern)source ../set_keys.sh
und verschieben Sie sie an den Anfang der AusführungsreihenfolgeAPI_KEY_A="$API_KEY_A"
Dadurch wird die Umgebungsvariable in der Compiler-Definition erfasst, die später bei jedem Clang-Aufruf für jede Quelldatei verwendet wird.
Beispiel Verzeichnisstruktur
quelle
In schnellen Paketen müssen Sie dies innerhalb des
swiftSettings
Arguments.target
in IhrerPackage.swift
Datei tun . Verwenden Sie diedefine
Methode (Apple-Dokumentation) oder die Swift-DokumentationMeins sieht so aus und es funktioniert!
In meinem Code kann ich unter bestimmten Bedingungen kompilieren:
quelle