- 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.
Añadir el "source" privado de SDOSLabs al Podfile
. Añadir también el source público de cocoapods para poder seguir instalando dependencias desde éste:
source 'https://github.com/SDOSLabs/cocoapods-specs.git' #SDOSLabs source
source 'https://github.com/CocoaPods/Specs.git' #Cocoapods source
Añadir la dependencia al Podfile
:
pod 'SDOSEnvironment', '~>1.4.0'
A partir de Xcode 12 podemos incluir esta librería a través de Swift package Manager.
Esta dependencia contiene dos librerías: una que se debe incluir en el proyecto (SDOSEnvironment
) y otra que es un script que no debe incluirse en el proyecto (SDOSEnvironmentScript
).
Existen 2 formas de añadirla a un proyecto:
Debemos abrir nuestro proyecto en Xcode y seleccionar el proyecto para abrir su configuración. Una vez aquí seleccionar la pestaña "Swift Packages" y añadir el siguiente repositorio
https://github.com/SDOSLabs/SDOSEnvironment.git
En el siguiente paso deberemos seleccionar la versión que queremos instalar. Recomentamos indicar "Up to Next Major" 1.4.0
.
Por último deberemos indicar el o los targets donde se deberá incluir la librería
Incluir la dependencia en el bloque dependencies
:
dependencies: [
.package(url: "https://github.com/SDOSLabs/SDOSEnvironment.git", .upToNextMajor(from: "1.4.0"))
]
Incluir la librería en el o los targets desados:
.target(
name: "YourDependency",
dependencies: [
"SDOSEnvironment"
]
)
Esta librería la usaremos en la Build Phase
de nuestro proyecto. El script de esta librería no se debe incluir en el binario de la aplicación y sólamente servirá para generar código. Para que podamos usarlo deberemos instalar la librería de la siguiente forma:
- Crearnos una dependencia local en nuestro proyecto. Para ello nuestro proyecto debe estar incluido en un
.xcworkspace
. Debemos pulsar el botón+
situado en la parte inferior izquierda del Xcode y seleccionar la opción "New Swift Package...". - Le pondremos el nombre "Autogenerate" al paquete
- Añadiremos la dependencia de
SDOSEnvironment
en elPackage.swift
, sin necesidad de añadirlo al target:
dependencies: [
.package(url: "https://github.com/SDOSLabs/SDOSEnvironment.git", .upToNextMajor(from: "1.4.0"))
]
De esta forma tendremos una carpeta en la raiz de nuestro proyecto que se llamará "Autogenerate" que contendrá un fichero Package.swift
que usaremos más adelante para ejecutar el script.
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:
Si la instalación es con cocoapods
"${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}
Si la instalación es con Swift Package Manager
SPM_PATH="${SRCROOT}/Autogenerate" (cd $SPM_PATH && xcrun --sdk macosx swift run SDOSEnvironmentScript -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 pará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 |
|
--struct-name |
Indica el nombre de la estructura que contiene las constantes. Por defecto es Environment |
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.1