web-dev-qa-db-fra.com

Swift: comment utiliser les drapeaux PREPROCESSOR (comme `#if DEBUG`) pour implémenter les clés API?

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?

64
cleverbit

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 de Preprocessor Macros passent avec le même préfixe. (22457329)

enter image description here

Vous utilisez le paramètre ci-dessus comme suit:

#if DEBUG
    let accessToken = "DebugAccessToken"
#else
    let accessToken = "ProductionAccessToken"
#endif
106
Dan Loewenherz

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:

  • Ouvrir les paramètres de construction pour votre cible
  • Recherchez "other Swift flags"
  • Ajoutez les macros que vous souhaitez utiliser, précédées de l'indicateur -D

enter image description here

117
cleverbit

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.

  1. Placez les "secrets" dans un fichier texte brut ci-dessus dans le référentiel englobant
  2. Créez un ../set_keys.sh contenant la liste de export API_KEY_A='<plaintext_key_aef94c5l6>' (utilisez un guillemet simple pour empêcher l'évaluation)
  3. Ajouter une phase de script d'exécution pouvant contenir source ../set_keys.sh et la placer en haut de l'ordre d'exécution
  4. Dans Paramètres de construction> Macros de préprocesseur, ajoutez des éléments à définir, tels que API_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
0
Michael Lorenzo