Dans Objective-C
, il était parfois utile d'utiliser des constantes de chaîne statiques pour définir d'autres clés d'API (par exemple, pour différencier les clés RELEASE et DEBUG des packages d'analyse, tels que MixPanel, Flurry ou Crashlytics):
#if DEBUG
static NSString *const API_KEY = @"KEY_A";
#else
static NSString *const API_KEY = @"KEY_B";
#endif
puis...
[Analytics startSession:API_KEY];
Comment cela se traduit-il en Swift, puisque le compilateur Swift n'utilise plus de préprocesseur?
Apple incluait la prise en charge intégrale de Swift indicateurs du préprocesseur à partir de Xcode 8 , il n'est donc plus nécessaire de définir ces valeurs dans "Autres Swift Drapeaux".
Le nouveau paramètre s'appelle "Conditions de compilation actives", ce qui fournit un support de niveau supérieur pour l'équivalent Swift des indicateurs de préprocesseur. Vous l'utilisez exactement de la même manière que vous le feriez avec "Other Swift Flags", sauf qu'il n'est pas nécessaire de préfixer la valeur avec un "-D" (c'est donc un peu plus propre).
Depuis le notes de version de Xcode 8 :
Active Compilation Conditions
est un nouveau paramètre de construction permettant de transmettre des indicateurs de compilation conditionnels au compilateur Swift. Chaque élément de la valeur de ce paramètre est transmis à swiftc avec le préfixe-
D, de la même manière que les éléments dePreprocessor Macros
passent avec le même préfixe. (22457329)
Vous utilisez le paramètre ci-dessus comme suit:
#if DEBUG
let accessToken = "DebugAccessToken"
#else
let accessToken = "ProductionAccessToken"
#endif
UPDATED: Xcode 8 prend désormais cela en charge automatiquement, voir la réponse de @ DanLoewenherz ci-dessus.
Avant Xcode 8, vous pouviez toujours utiliser les macros de la même manière:
#if DEBUG
let apiKey = "KEY_A"
#else
let apiKey = "KEY_B"
#endif
Toutefois, pour que Swift les récupère, vous devez définir "Autres Swift Drapeaux" dans les paramètres de construction de votre cible:
-D
En guise d'observation de suivi, essayez de ne pas conserver les clés/secrets de l'API en texte clair dans le référentiel. Utilisez un système de gestion de secrets pour charger les clés/secrets dans les variables d'environnement de l'utilisateur. Sinon, l'étape 1 est nécessaire, si cela est acceptable.
../set_keys.sh
contenant la liste de export API_KEY_A='<plaintext_key_aef94c5l6>'
(utilisez un guillemet simple pour empêcher l'évaluation)source ../set_keys.sh
et la placer en haut de l'ordre d'exécutionAPI_KEY_A="$API_KEY_A"
.Cela capture la variable d’environnement dans la définition du compilateur qui sera utilisée ultérieurement dans chaque appel de clang pour chaque fichier source.
Exemple de structure de répertoire
[10:33:15] ~/code/memo yes? tree -L 2 .
.
├── Memo
│ ├── Memo
│ ├── Memo.xcodeproj
│ ├── Memo.xcworkspace
│ ├── Podfile
│ ├── Podfile.lock
│ └── Pods
└── keys