Existen dos claves para la identificación de una versión cuando trabajamos con un proyecto en Xcode. La primera de ellas es CFBundleShortVersionString
, también conocida como “marketing version”, y es la que se suele presentar al usuario con un formato del tipo ., aunque podría tener un formato diferente. La segunda clave utilizada para el número de versión es CFBundleVersion
, también llamada “build version”, y en la que yo personalmente acostumbro a usar un número entero positivo.
Como desarrolladores cada uno podemos tener una estrategia distinta para numerar nuestras versiones. Yo voy a explicar a continuación la mía, que no tiene por qué ser la mejor pero es la que estoy acostumbrado a usar.
Para la marketing version suelo comenzar a numerarla en 0.01 y la incremento en un número de versión menor cuando añado alguna funcionalidad e incremento el número de versión mayor cuando el cambio de la aplicación es significativo.
Para la build version comienzo en 1 e incremento en uno su valor por cada compilación que realizo en release puesto que suele ser cuando creo una versión que distribuyo a un cliente a través de TestFlight o similar y quiero que quede constancia de ese momento.
En mi caso, lo que deseo automatizar es por tanto el incremento de la build version y he encontrado dos formas posibles con las que poder realizarlo:
agvtool
La primera forma de incrementar la build version es usar la herramienta agvtool (Apple-generic versioning tool for Xcode projects). Pero con la llegada de la versión 4.3 Xcode ha pasado de situarse en /Developer
a estar en /Applications
como cualquier otra aplicación descargada desde la Mac App Store.
Así pues, si intentamos ejecutar agvtool nos encontraremos con el siguiente mensaje de error:
$ agvtool
Error: No developer directory found at /Developer. Run /usr/bin/xcode-select to update the developer directory path.
Para corregir el problema ejecutaremos la siguiente instrucción en una ventana del Terminal:
$ sudo /usr/bin/xcode-select -switch /Applications/Xcode.app
Ahora ya podremos ejecutar agvtool sin errores.
Nuestro siguiente paso es configurar nuestro proyecto de Xcode para poder usar correctamente avgtool. Para esto tendremos que establecer en Build Settings la propiedad Current Project Version al valor en el que queramos comenzar a numerar nuestra build version (a mi me gusta iniciar a 1) y Versioning System al valor Apple Generic.
Ahora, si abrimos una ventana del Terminal podemos escribir el siguiente comando para conocer el número de build version actual del proyecto:
$ agvtool what-version
Para incrementar el número de build version escribiremos el comando:
$ agvtool bump -all
El número de marketing version lo podemos actualizar con el comando:
$ agvtool new-marketing-version "0.02"
Genial ¿verdad? Bueno, pero ahora nos queda la cuestión de que queremos que este valor de build version se incremente automáticamente.
Podríamos incluir el comando agvtool bump -all
como un Script dentro de Build Phases pero corremos un alto riesgo de que Xcode casque en tiempo de compilación :( Así que la opción es ejecutarlo en el Terminal preferiblemente con el proyecto de Xcode cerrado. La verdad es que esto limita bastante el hecho de que se incremente el número de versión de manera automática, así que yo prefiero usar el siguiente método.
Shell Script
En lugar de usar avgtool yo prefiero usar un script en Build Phases. Así que lo primero que tenemos que hacer es añadir un Run Script con el botón Add Build Phase.
Y añado las siguientes instrucciones:
#!/bin/bash
# increment build number
buildPlist="${PROJECT_DIR}/${INFOPLIST_FILE}"
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$buildPlist")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$buildPlist"
De esta manera, cada vez que compilemos el proyecto en Xcode se incrementará en uno el build version.
Si lo que quiero es que tan sólo se incremente el número de versión cuando la compilación sea en Release entonces las instrucciones que añado son estas:
#!/bin/bash
if [ "$CONFIGURATION" == "Release" ]; then
# increment build number
buildPlist="${PROJECT_DIR}/${INFOPLIST_FILE}"
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$buildPlist")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$buildPlist"
fi
Así, el número de versión se incrementará tan sólo tras realizar una compilación en Release.
Si conoces cualquier otra manera de autoincrementar los números de versión en un proyecto de Xcode no dudes en contármelo.
Referencias:
Apple OS X Developer Library | Information Property List Key Reference
Apple OS X Developer Library | avgtool
chanson.livejournal.com | Xcode: Build numbers and versioning with agvtool
stuff.bondo.net | Using Build and Version Numbers and the Art of Injecting Them into Your App (script on github)
Terry Blanchard | Incrementing Version and Build Numbers with Xcode
Jayway | Auto-incrementing Build Numbers in Xcode
Imthiaz Blog | Auto Increment Build Number & Date in XCode iPhone Project
Mac Indie | Recipe: Automatic Version Number, Build Number & Build Date Handling