2011-08-02 15 views
18

que estoy tratando de hacer lo siguiente:iOS: Cambio info.plist durante la fase de construcción

  1. Durante la fase de construcción, abra un archivo de texto plano y leer el texto
  2. Cambiar el valor de una propiedad en info.plist al valor obtenido en el paso 1.

¿Puedo escribir un script de shell para esto?

Será genial si alguien me puede guiar para lograrlo.

Respuesta

13

Sí, puedes. Lo haría en tres pasos:

  1. Escriba un script de shell que se ejecute antes de la primera fase de compilación. Deje que este script establezca una variable de entorno.
  2. Habilite "Amplíe la configuración de compilación en Info.plist" para su proyecto.
  3. Utilice la variable de entorno en el archivo plist como ${MY_COOL_SETTING}.
+1

Gracias! Pero, ¿cómo puedo abrir un archivo y leer su texto durante esta fase? – Mithin

+0

@Mithin: depende completamente del idioma en el que escriba el script de shell. – PeyloW

+1

¿Qué sucede si la clave es un booleano? No aceptará los marcadores de posición del nombre de la variable de entorno. –

7

@PeyloW ofrece una manera de hacerlo. La otra forma de hacerlo es agregar un paso de compilación Ejecutar script. En ese paso, puede volver a escribir su Info.plist de la forma que quiera. Lo hago todo el tiempo para configurar la versión svn.

Recomiendo colocar su secuencia de comandos en un archivo, y luego poner . myscript.sh en la fase Ejecutar script. Esto es más fácil de entender y mantener que poner toda la secuencia de comandos directamente en Xcode.

+2

+1 para poner la secuencia de comandos en un archivo separado. Solía ​​reescribir el archivo plist también. Pero hacerlo tiende a hacer revisiones innecesarias para el archivo plist en control de fuente. Entonces cambié a la solución env-variable. – PeyloW

+0

La solución env-variable es agradable, y si construyo otro script de control de versiones, puedo cambiar a ese enfoque por simplicidad. El script es más flexible. –

2

Tengo un archivo de script que coloca un número de compilación en un campo de mi info.plist. Puse un texto de marcador de posición en el info.plist en el proyecto y luego el script simplemente lo reemplaza. Solo incrementa el número de compilación en versiones de lanzamiento. En las construcciones de desarrollo solo dice que son una compilación de desarrollo.

if [ "$BUILD_STYLE" = "Release" ] 
    then 
    if [ ! -f build-number ]; then 
     echo 0 > build-number 
    else 
     expr `cat build-number` + 1 > build-number.new 
     mv build-number.new build-number 
    fi 

    perl -pi -e s/BUILD_NUMBER_PLACEHOLDER/`cat build-number`/ $BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app/Contents/Info.plist 
    else 
    perl -pi -e s/BUILD_NUMBER_PLACEHOLDER/`echo Development`/ $BUILT_PRODUCTS_DIR/$PRODUCT_NAME.app/Contents/Info.plist 
    fi 
16

Probablemente la manera más simple es utilizar PlistBuddy. Tengo una fase de ejecución de secuencias de comandos que se ve así:

BUILD_NUMBER=`git rev-list HEAD --count` 
INFO_PLIST="$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH" 
if [ -f "$BUILT_PRODUCTS_DIR/$INFOPLIST_PATH" ] ; then 
    oldversion=`/usr/libexec/PlistBuddy -c "Print :CFBundleVersion" "$INFO_PLIST"` 
fi 
if [ "$BUILD_NUMBER" != "$oldversion" ] ; then 
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $BUILD_NUMBER" "$INFO_PLIST" 
fi 

(Tenga en cuenta que a partir de Xcode 6, hay que ejecutar este después de la fase de copia de Recursos Bundle, porque Info.plist no se copia en la ubicación de destino hasta entonces y PlistBuddy fallaría.)

Editar 01/17: Se actualizó para evitar la copia innecesaria o la firma de objetivos. No desea tocar Info.plist a menos que algo realmente cambie, de lo contrario Xcode lo tratará (y, por tanto, el destino) como modificado. Verificar el valor anterior CFBundleVersion puede acelerar significativamente las compilaciones; me ha ahorrado varios segundos en la compilación de noop.

+0

Me llevó mucho tiempo descubrir por qué mi script funcionaba para compilaciones regulares pero fallaba en las compilaciones de archivos. Debe ejecutarse después de Copiar recursos de paquete. ¡Gracias! –

Cuestiones relacionadas