- Enlace confluence: https://kc.sdos.es/x/PwLLAQ
- Changelog: https://github.com/SDOSLabs/SDOSEnvironment/blob/master/CHANGELOG.md
SDOSEnvironment es una librería que permite configurar constantes que tengan valores diferentes para cada entorno de ejecución (Debug, Preproduction, Production, etc). Esto es muy útil para casos como url de ws, claves de analíticas, etc, donde en cada entorno de ejecución pueden ser diferentes. Con está librería cada entorno dispondrá de los valores correctos, sin necesidad de modificarlos dependiendo del que queramos ejecutar. Además, la librería aporta un punto extra de seguridad encriptando el fichero que contiene las variables de entorno, haciendo más dificil para un atacante ver los valores que contiene.
Usaremos CocoaPods. Hay que añadir la dependencia al Podfile
:
pod 'SDOSEnvironment', '~>1.1.0'
La librería proporciona todo lo necesario para usar las variables de entorno, sin que el usuario tenga que escribir ninguna función ya que contiene un script
para encriptar el fichero de xml con la configuración de los entornos y generar el código necesario para acceder a estos valores.
El script de encriptación y generación de código no se incluye en el binario de la aplicación. Hay que hacer uso de él durante las Build Phases
. Para ello hay que seguir los siguientes pasos:
- Añadir el fichero Environments.plist con las variables y los entornos. Este fichero no se debe incluir al target ya que no debe ir en el binario de la aplicación. Copiar el siguiente código para crear un fichero básico:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>wsUrl</key>
<dict>
<key>Debug</key>
<string>https://debug.com</string>
<key>Preproduction</key>
<string>https://preproduction.com</string>
<key>Production</key>
<string>https://production.com</string>
</dict>
</dict>
</plist>
- En Xcode: Seleccionar el proyecto, elegir el TARGET, selccionar la pestaña de
Build Phases
y pulsar en añadirNew Run Script Phase
en el icono de + arriba a la izquierda - Arrastrar el nuevo
Run Script
justo antes deCompile Sources
- (Opcional) Renombrar el script a
SDOSEnvironment - Encrypt environments
- Copiar el siguiente script:
"${PODS_ROOT}/SDOSEnvironment/src/Scripts/SDOSEnvironment" -b ${PRODUCT_BUNDLE_IDENTIFIER} -i "${SRCROOT}/main/resources/Environments.plist" -output-bin "${SRCROOT}/main/resources/generated/Environments.bin" -output-file "${SRCROOT}/main/resources/generated/EnvironmentGenerated.swift" -validate-environment ${SDOSEnvironment}
Los valores del script pueden cambiarse en función de las necesidades del proyecto
- Añadir
${SRCROOT}/main/resources/Environments.plist
al apartadoInput Files
. No poner comillas - Añadir
${SRCROOT}/main/resources/generated/Environments.bin
al apartadoOutput Files
. No poner comillas - Añadir
${SRCROOT}/main/resources/generated/EnvironmentGenerated.swift
al apartadoOutput Files
. No poner comillas - Compilar el proyecto. Esto generará los ficheros en la ruta
${SRCROOT}/main/resources/generated/
que deberán ser incluidos en el proyecto
En cada compilación, si se ha modificado el fichero ${SRCROOT}/main/resources/Environments.plist
el Build Phase
se volverá a ejecutar realizando la siguientes labores:
- Validar el fichero indicado en el parámetro
-i
y encriptarlo en base al parámetro-b
. El script usa está información para generar una contraseña de encriptación. IMPORTANTE: este valor debe ser el mismo al realizar la configuración en el código. En caso contrario la librería no podrá desencriptar el fichero - Generar el fichero con las variables encriptadas en la ruta
-output-bin
- Generar el fichero con el código swift en la ruta
-output-file
- Validar si todas las variables tienen el entorno indicado en el parámetro
-validate-environment
El script tiene los siguientes parámetros que pueden incluirse en base a las necesidades del proyecto:
Parámetro | Obligatorio | Descripción | Ejemplo |
---|---|---|---|
-i [valor] |
[x] | Ruta del fichero de entrada. Debe ser un .plist | ${SRCROOT}/main/resources/Environments.plist |
-output-bin [valor] |
[x] | Ruta del fichero encriptado de salida. Debe incluir el nombre del fichero a generar | ${SRCROOT}/main/resources/generated/Environments.bin |
-b [valor] |
[x]* | Bundle identifier de la aplicación. Se usará para generar la contraseña del fichero encriptado en base a éste | ${PRODUCT_BUNDLE_IDENTIFIER} // es.sdos.bundleid |
-output-file [valor] |
[x] | Ruta del fichero autogenerado de salida. Debe incluir el nombre del fichero a generar | ${SRCROOT}/main/resources/generated/EnvironmentGenerated.swift |
-validate-environment [valor] |
String correspondiente al entorno que se quiere validar. La validación comprobará que todas las claves indicadas en el fichero tengan un valor para el entorno definido | ${SDOSEnvironment} // Debug |
|
-p [valor] |
[x]* | Contraseña usada para encriptar el fichero. Éste paraámetro no tendrá en cuenta si se ha indicado el parámetro -b |
Aa123456 |
--disable-input-output-files-validation |
Deshabilita la validación de los inputs y outputs files. Usar sólo para dar compatibilidad a Legacy Build System |
||
--unlock-files |
Indica que los ficheros de salida no se deben bloquear en el sistema | ||
-access-level |
Indica que el modificador de acceso al sistema | public |
|
*Uno de los dos valores debe estar en la ejecución del script |
Puedes consultar la ayuda completa ejecutando
./SDOSEnvironment help
en el terminal
El formato del fichero Environments.plist es el siguiente:
- En la raiz del xml se crean variables de tipo
Dictionary
que serán las claves de las variables de entorno - Dentro de cada
Dictionary
se crean variables de tipoStrings
donde cada clave es el entorno y el valor será el que se recupere cuando se solicite
Para usar la librería sólo es necesario lanzar la configuración inicial de la librería y usar el código swift que genera el script. Se recomienda añadir como primera línea de ejecución de la aplicación la configuración de la librería:
-
Añadir el valor
SDOSEnvironment
alBuild Setting
comoUser Define
o en los ficheros.xcconfig
de cada entorno, con su valor correspondiente (Debug, Preproduction o Production) -
Añadir el siguiente código al
Info.plist
del proyecto<key>EnvironmentKey</key><string>$(SDOSEnvironment)</string>
Si la variable
SDOSEnvironment
cambia habrá que hacer un Clean del proyecto para que se vea reflejada -
Lanzar la configuración de la librería:
SDOSEnvironment.configure(activeLogging: true)
-
Usar el código autogenerado donde se requiera
Environment.wsUrl
- RNCryptor - 5.x