В Objective-C
это иногда полезно использовать статические строковые константы для определения альтернативных ключей API (например, дифференцируется между RELEASE и ключами DEBUG для аналитических пакетов, как MixPanel, Flurry или Crashlytics):
#if DEBUG
static NSString *const API_KEY = @"KEY_A";
#else
static NSString *const API_KEY = @"KEY_B";
#endif
а потом...
[Analytics startSession:API_KEY];
Как это соотносится с Swift, если компилятор Swift больше не использует препроцессор?
источник
=1
... Я потерял немного времени, пытаясь понять, почему он не работает когда я это сделал. Итак, я подумал, что поделюсь этим лакомым кусочком, чтобы помочь следующему парню. :] В любом случае, спасибо за ваш ответ здесь!DEBUG
in, такActive Compilation Conditions
иDEBUG=1
in,Preprocessor Macros
и эта конфигурация вообще не работает. Следует удалитьDEBUG=1
?? Не ясно из приведенных выше комментариев.Build Configuration
сначала проверьте свою цель . Проверьте этот ответ stackoverflow.com/questions/9063100/… для получения дополнительной информации.ОБНОВЛЕНО: Xcode 8 теперь поддерживает это автоматически, см. Ответ @ DanLoewenherz выше.
До Xcode 8 вы могли использовать макросы таким же образом:
#if DEBUG let apiKey = "KEY_A" #else let apiKey = "KEY_B" #endif
Однако для того, чтобы Swift мог их подобрать, вам необходимо установить «Other Swift Flags» в настройках сборки вашей цели:
-D
флагомисточник
-D
приставкиВ качестве последующего наблюдения постарайтесь не хранить ключи / секреты API в репозитории открытым текстом. Используйте систему управления секретами для загрузки ключей / секретов в переменные среды пользователя. В противном случае шаг 1 необходим, если он приемлем.
../set_keys.sh
, содержащий списокexport API_KEY_A='<plaintext_key_aef94c5l6>'
(используйте одинарные кавычки, чтобы предотвратить оценку)source ../set_keys.sh
и переместите ее в начало порядка выполнения.API_KEY_A="$API_KEY_A"
Это фиксирует переменную среды в определении компилятора, которое позже используется при каждом вызове clang для каждого исходного файла.
Пример структуры каталогов
[10:33:15] ~/code/memo yes? tree -L 2 . . ├── Memo │ ├── Memo │ ├── Memo.xcodeproj │ ├── Memo.xcworkspace │ ├── Podfile │ ├── Podfile.lock │ └── Pods └── keys
источник
В быстрых пакетах вы должны сделать это внутри
swiftSettings
аргумента.target
в вашемPackage.swift
файле. Используйтеdefine
метод (документация Apple) или документацию Swifttargets: [ .target(name: String, dependencies: [Target.Dependency], path: String?, exclude: [String]?, sources: [String]?,, cSettings: [CSetting]?, cxxSettings: [CXXSetting]?, swiftSettings: [SwiftSetting]?, linkerSettings: [LinkerSetting]?),
Мой выглядит так и работает!
swiftSettings: [ .define("VAPOR") ]
в моем коде я могу условно скомпилировать, используя это:
#if VAPOR
источник