El camino hasta ahora
Mi caso de uso fue que:
- Estoy sincronizando la versión y los números de compilación en varios objetivos.
- Estoy sincronizando la versión y los números de compilación con los del objetivo
Settigns.bundle
- Estoy leyendo y modificando el número de compilación de un servidor CI.
Solía ejecutar los puntos 1 y 2 como un script de compilación de destino y el punto 3 como un script personalizado en el propio CI.
La nueva forma de almacenar la versión y la compilación dentro de la configuración de compilación de Xcode estaba causando problemas con los scripts, porque ya no podían modificar efectivamente los valores. Al menos la lectura era posible.
Desafortunadamente, no pude descubrir una forma legítima de evitar que Xcode almacene la versión y los números de compilación en la configuración de compilación del proyecto, sin embargo, he logrado crear una solución alternativa.
Resulta que cuando se crea una compilación o un archivo, Info.plist
se utiliza el valor escrito en el . Esto significa que el valor se sustituye durante el tiempo de construcción, lo que no nos permite modificarlo durante el mismo tiempo de construcción.
También intenté modificar el proyecto usando xcodeproj
cli, sin embargo, cualquier cambio en el proyecto causó que las compilaciones se detuvieran, por lo que esta solución no funcionaba.
Finalmente, después de muchos enfoques diferentes que probé, finalmente logré encontrar un compromiso que no estaba violando el nuevo comportamiento del Xcode.
Respuesta corta:
Como acción previa del objetivo, se ejecuta un script que escribe los valores respectivos en CFBundleShortVersionString
y CFBundleVersion
para el objetivoInfo.plist
Como fuente de verdad, uso la configuración de compilación de Xcode para leer los valores de MARKETING_VERSION
yCURRENT_PROJECT_VERSION
de la meta deseada.
De esta manera, cuando modifique los valores de la configuración del proyecto, en la próxima compilación / archivo, se escribirán en el Info.plist
, permitiendo que su lógica de secuencias de comandos existente continúe funcionando.
Respuesta detallada
La única forma de modificar un recurso en una acción de compilación es mediante un pre-action
script. Si intenta hacerlo desde un script de compilación, los cambios no tendrán efecto de inmediato y no estarán presentes al final de la compilación / archivo.
Para agregar una acción previa a la construcción, vaya al esquema de edición.
Luego expanda las secciones Construir y Archivar. Debajo Pre-action
, haga clic en el Provide build and settings from
menú desplegable y seleccione la fuente del objetivo de verdad desde el que desea leer los valores.
Agregue el siguiente script:
# 1)
cd ${PROJECT_DIR}
# 2)
exec > Pruvit-Int.prebuild.sync_project_version_and_build_with_info_plists.log 2>&1
# 3)
./sync_project_version_and_build_with_info_plists.sh $MARKETING_VERSION $CURRENT_PROJECT_VERSION
Las líneas de script hacen lo siguiente:
- Vaya al directorio donde se encuentra el script de sincronización para ejecutarlo
- Permite que se escriba un registro durante la acción previa; de lo contrario, cualquier salida se silencia de forma predeterminada
- Ejecute el script de sincronización proporcionando el
MARKETING_VERSION
yCURRENT_PROJECT_VERSION
El último paso es escribir su propio guión de sincronización que lee los valores de la prevista MARKETING_VERSION
yCURRENT_PROJECT_VERSION
al objetivo / s respectivo y siempre que lo desee.
En mi caso, el script es el siguiente:
#!/bin/bash
#IMPORTANT - this script must run as pre-action of each target's Build and Archive actions
version_number=$1
build_number=$2
echo "version_number is $version_number"
echo "build_number is $build_number"
#update Pruvit/Info.plist
pruvitInfoPlist="Pruvit/Info.plist"
/usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString $version_number" $pruvitInfoPlist
/usr/libexec/PlistBuddy -c "Set CFBundleVersion $build_number" $pruvitInfoPlist
#update Pruvit/Settings.bundle
settingsPlist="Pruvit/Settings.bundle/Root.plist"
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version_number" $settingsPlist
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $build_number" $settingsPlist
#update BadgeCounter/Info.plist
badgeCounterInfoPlist="BadgeCounter/Info.plist"
/usr/libexec/PlistBuddy -c "Set CFBundleShortVersionString $version_number" $badgeCounterInfoPlist
/usr/libexec/PlistBuddy -c "Set CFBundleVersion $build_number" $badgeCounterInfoPlist
Uso compartido Info.plist
y Settings.bundle
entre mis dos objetivos de aplicación, así que tengo que actualizar esto una vez.
También uso una extensión de servicio de notificación BadgeCounter
, que tiene que tener exactamente la misma versión y compilación que el objetivo en el que está incrustado. Así que actualizo esto también.