Swift: ¿cómo usar los indicadores PREPROCESSOR(como `#if DEBUG`) para implementar claves API?
xcode macros (3)
Apple incluyó soporte completo para las banderas de preprocesador Swift a partir de Xcode 8 , por lo que ya no es necesario establecer estos valores en "Otras banderas Swift".
La nueva configuración se denomina "Condiciones de compilación activa", que proporciona soporte de nivel superior para el equivalente Swift de las banderas de preprocesador. Lo usa exactamente de la misma manera que lo haría con "Otras banderas rápidas", excepto que no es necesario anteponer el valor con una "-D" (por lo que es un poco más limpio).
De las notas de la versión de Xcode 8 :
Active Compilation Conditions
es una nueva configuración de compilación para pasar banderas de compilación condicional al compilador Swift. Cada elemento del valor de esta configuración pasa a swiftc con el prefijo-
D, de la misma manera que los elementos de lasPreprocessor Macros
dePreprocessor Macros
pasan a sonar con el mismo prefijo. (22457329)
Utiliza la configuración anterior así:
#if DEBUG
let accessToken = "DebugAccessToken"
#else
let accessToken = "ProductionAccessToken"
#endif
En
Objective-C
, a veces era útil usar constantes de cadena estáticas para definir claves API alternativas (por ejemplo, para diferenciar entre las teclas RELEASE y DEBUG para paquetes de análisis, como MixPanel, Flurry o Crashlytics):
#if DEBUG
static NSString *const API_KEY = @"KEY_A";
#else
static NSString *const API_KEY = @"KEY_B";
#endif
y entonces...
[Analytics startSession:API_KEY];
¿Cómo se traduce esto a Swift, ya que el compilador Swift ya no usa un preprocesador?
Como observación de seguimiento, trate de no mantener claves / secretos de API en texto sin formato en el repositorio. Utilice un sistema de gestión de secretos para cargar las claves / secretos en las variables de entorno del usuario. De lo contrario, el paso 1 es necesario, si es aceptable.
- Coloque los "secretos" en un archivo de texto sin formato arriba en el repositorio adjunto
-
Cree un
../set_keys.sh
que contenga una lista deexport API_KEY_A=''<plaintext_key_aef94c5l6>''
(use comillas simples para evitar la evaluación) -
Agregue una fase de secuencia de comandos de ejecución que pueda
source ../set_keys.sh
y moverla a la parte superior del orden de ejecución -
En Configuración de compilación> Macros de preprocesador, agregue a definiciones según sea necesario, como
API_KEY_A="$API_KEY_A"
Eso captura la variable de entorno en la definición del compilador, que luego se utiliza en cada invocación de sonido para cada archivo fuente.
Ejemplo de estructura de directorios
[10:33:15] ~/code/memo yes? tree -L 2 .
.
├── Memo
│ ├── Memo
│ ├── Memo.xcodeproj
│ ├── Memo.xcworkspace
│ ├── Podfile
│ ├── Podfile.lock
│ └── Pods
└── keys
ACTUALIZADO: Xcode 8 ahora admite esto automáticamente, consulte la respuesta de @ DanLoewenherz arriba.
Antes de Xcode 8, aún podía usar Macros de la misma manera:
#if DEBUG
let apiKey = "KEY_A"
#else
let apiKey = "KEY_B"
#endif
Sin embargo, para que Swift los recoja, debe establecer "Otras banderas de Swift" en la Configuración de compilación de su objetivo:
- Abra la configuración de compilación para su objetivo
- Buscar "otras banderas rápidas"
-
Agregue las macros que desea usar, precedidas por el indicador
-D