swift xcode macros preprocessor

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 las Preprocessor Macros de Preprocessor 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.

  1. Coloque los "secretos" en un archivo de texto sin formato arriba en el repositorio adjunto
  2. Cree un ../set_keys.sh que contenga una lista de export API_KEY_A=''<plaintext_key_aef94c5l6>'' (use comillas simples para evitar la evaluación)
  3. 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
  4. 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