¿Cómo puedo visualizar la revisión de la versión de la aplicación en el paquete de configuraciones de mi aplicación?

Me gustaría incluir la versión de la aplicación y la revisión interna, algo así como 1.0.1 (r1243), en el paquete de configuraciones de mi aplicación.

El archivo Root.plist contiene un fragmento como este …

 Type PSTitleValueSpecifier Title Version Key version_preference DefaultValue VersionValue Values  VersionValue  Titles  VersionValue   

y me gustaría reemplazar la cadena “VersionValue” en tiempo de comstackción.

Tengo un script que puede extraer el número de versión de mi repository, lo que necesito es una forma de procesar (preprocesar) el archivo Root.plist, en tiempo de comstackción, y reemplazar el número de revisión sin afectar el archivo de origen.

Hay otra solución que puede ser mucho más simple que cualquiera de las respuestas anteriores. Apple incluye una herramienta de línea de comandos llamada PlistBuddy en la mayoría de sus instaladores, y la ha incluido en Leopard en /usr/libexec/PlistBuddy .

Como quiera reemplazar VersionValue , suponiendo que tiene el valor de la versión extraído en $newVersion , podría usar este comando:

 /usr/libexec/PlistBuddy -c "Set :VersionValue $newVersion" /path/to/Root.plist 

No es necesario jugar con sed o expresiones regulares, este enfoque es bastante sencillo. Consulte la página de manual para obtener instrucciones detalladas. Puede usar PlistBuddy para agregar, eliminar o modificar cualquier entrada en una lista de propiedades. Por ejemplo, un amigo mío blogueó sobre incrementar los números de comstackción en Xcode usando PlistBuddy.

Nota: si proporciona solo la ruta al plist, PlistBuddy ingresa al modo interactivo, por lo que puede emitir varios comandos antes de decidir guardar los cambios. Definitivamente recomiendo hacer esto antes de colocarlo en tu script de comstackción.

La solución de mi perezoso fue actualizar el número de versión de mi código de aplicación. Puede tener un valor predeterminado (o en blanco) en Root.plist y luego, en algún lugar de su código de inicio:

 NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; [[NSUserDefaults standardUserDefaults] setObject:version forKey:@"version_preference"]; 

La única pega es que tu aplicación debería ejecutarse al menos una vez para que la versión actualizada aparezca en el panel de configuración.

Podrías llevar la idea más allá y actualizar, por ejemplo, un contador de cuántas veces se ha lanzado tu aplicación u otros datos interesantes.

Basado en la respuesta de @ Quinn, aquí el proceso completo y el código de trabajo que uso para hacer esto.

  • Agrega un paquete de configuraciones a tu aplicación. No lo cambie de nombre
  • Abra Settings.bundle / Root.plist en un editor de texto

Reemplace los contenidos con:

 < ?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">   PreferenceSpecifiers   Title About Type PSGroupSpecifier   DefaultValue DummyVersion Key version_preference Title Version Type PSTitleValueSpecifier   StringsTable Root   
  • Cree una fase de comstackción Ejecutar script , muévase para estar después de la fase Copiar recursos de paquete . Agrega este código:

     cd "${BUILT_PRODUCTS_DIR}" buildVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${INFOPLIST_PATH}" ) /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $buildVersion" "${WRAPPER_NAME}/Settings.bundle/Root.plist" 
  • Reemplace MyAppName con el nombre de su aplicación real, y el 1 después de PreferenceSpecifiers para que sea el índice de su entrada de la Versión en la Configuración. El ejemplo de Root.plist anterior lo tiene en el índice 1.

Usando el plist de Ben Clayton https://stackoverflow.com/a/12842530/338986

Agregue la Run script con el siguiente fragmento después de Copy Bundle Resources .

 version=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$PROJECT_DIR/$INFOPLIST_FILE") build=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$PROJECT_DIR/$INFOPLIST_FILE") /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $version ($build)" "$CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist" 

CFBundleVersion además de CFBundleShortVersionString . Emite una versión como esta:

Al escribir en $CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist lugar del que está en $SRCROOT tiene algunos beneficios.

  1. No modifica los archivos en la copia de trabajo del repository.
  2. No es necesario que $SRCROOT ruta a Settings.bundle en $SRCROOT . La ruta puede variar.

Prueba en Xcode 7.3.1

Basado en el ejemplo aquí , aquí está el script que estoy usando para actualizar automáticamente el número de versión del paquete de configuraciones:

 #! /usr/bin/env python import os from AppKit import NSMutableDictionary settings_file_path = 'Settings.bundle/Root.plist' # the relative path from the project folder to your settings bundle settings_key = 'version_preference' # the key of your settings version # these are used for testing only info_path = '/Users/mrwalker/developer/My_App/Info.plist' settings_path = '/Users/mrwalker/developer/My_App/Settings.bundle/Root.plist' # these environment variables are set in the XCode build phase if 'PRODUCT_SETTINGS_PATH' in os.environ.keys(): info_path = os.environ.get('PRODUCT_SETTINGS_PATH') if 'PROJECT_DIR' in os.environ.keys(): settings_path = os.path.join(os.environ.get('PROJECT_DIR'), settings_file_path) # reading info.plist file project_plist = NSMutableDictionary.dictionaryWithContentsOfFile_(info_path) project_bundle_version = project_plist['CFBundleVersion'] # print 'project_bundle_version: '+project_bundle_version # reading settings plist settings_plist = NSMutableDictionary.dictionaryWithContentsOfFile_(settings_path) for dictionary in settings_plist['PreferenceSpecifiers']: if 'Key' in dictionary and dictionary['Key'] == settings_key: dictionary['DefaultValue'] = project_bundle_version # print repr(settings_plist) settings_plist.writeToFile_atomically_(settings_path, True) 

Este es el Root.plist que tengo en Settings.bundle:

 < ?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">   PreferenceSpecifiers   Title About Type PSGroupSpecifier   DefaultValue 1.0.0.0 Key version_preference Title Version Type PSTitleValueSpecifier   StringsTable Root   

Las otras respuestas no funcionan correctamente por una razón: la fase de comstackción ejecutar script no se ejecuta hasta DESPUÉS de que se haya empaquetado el paquete de configuraciones. Por lo tanto, si su versión de Info.plist es 2.0.11 y la actualiza a 2.0.12, entonces compile / archive su proyecto, el paquete de Configuraciones seguirá diciendo 2.0.11. Si abre el paquete de configuración Root.plist, puede ver que el número de versión no se actualiza hasta el final del proceso de comstackción. Puede crear el proyecto OTRA VEZ para obtener el paquete Configuraciones actualizado correctamente, o puede agregar el script a una fase previa a la creación en su lugar …

  • En XCode, edite el esquema para su objective de proyecto
  • Haga clic en la flecha de divulgación en el esquema BUILD
  • Luego, haga clic en el elemento “Pre-acciones”
  • Haga clic en el signo más y seleccione “Nueva ejecución de acción de script”
  • Establezca el valor de shell en / bin / sh
  • Establezca “Proporcionar configuraciones de comstackción desde” a su objective de proyecto
  • Agregue su script al área de texto. La siguiente secuencia de comandos funcionó para mí. Es posible que deba modificar las rutas para que coincidan con la configuración de su proyecto:

    versionString = $ (/ usr / libexec / PlistBuddy -c “Print CFBundleVersion” “$ {PROJECT_DIR} / $ {INFOPLIST_FILE}”)

    / usr / libexec / PlistBuddy “$ SRCROOT / Settings.bundle / Root.plist” -c “set PreferenceSpecifiers: 0: DefaultValue $ versionString”

Esto ejecutará correctamente el script ANTES de que el paquete de Configuraciones esté empaquetado durante el proceso de comstackción / archivo. Si abre el paquete Configuraciones Root.plist y crea / archiva su proyecto, ahora verá que el número de versión se actualiza al comienzo del proceso de comstackción y su paquete de Configuraciones mostrará la versión correcta.

Me las arreglé para hacer lo que quería usando el pjectist de código abierto pListcompiler ( http://sourceforge.net/projects/plistcompiler ).

  1. Usando este comstackdor puede escribir el archivo de propiedad en un archivo .plc usando el siguiente formato:

     plist { dictionary { key "StringsTable" value string "Root" key "PreferenceSpecifiers" value array [ dictionary { key "Type" value string "PSGroupSpecifier" key "Title" value string "AboutSection" } dictionary { key "Type" value string "PSTitleValueSpecifier" key "Title" value string "Version" key "Key" value string "version" key "DefaultValue" value string "VersionValue" key "Values" value array [ string "VersionValue" ] key "Titles" value array [ string "r" kRevisionNumber ] } ] } } 
  2. Tenía una fase de comstackción de script de ejecución personalizada que extraía la revisión de mi repository al archivo .h como lo describe brad-larson aquí .

  3. El archivo plc puede contener directivas de preprocesador, como #define, #message, #if, #elif, #include, #warning, #ifdef, #else, #pragma, #error, #ifndef, #endif, xcode variables de entorno. Así que pude hacer referencia a la variable kRevisionNumber agregando la siguiente directiva

     #include "Revision.h" 
  4. También agregué una fase de creación de scripts personalizada a mi objective de xcode para ejecutar el plompiler cada vez que se construye el proyecto.

     /usr/local/plistcompiler0.6/plcompile -dest Settings.bundle -o Root.plist Settings.plc 

¡Y eso fue todo!

Creo que puedes hacer esto usando una forma similar a la que describo en esta respuesta (basada en esta publicación ).

En primer lugar, puede hacer que VersionValue sea una variable dentro de Xcode al cambiarle el nombre a $ {VERSIONVALUE}. Cree un archivo llamado versionvalue.xcconfig y agréguelo a su proyecto. Vaya a su destino de la aplicación y vaya a la configuración de comstackción para ese objective. Creo que debe agregar VERSIONVALUE como una configuración de comstackción definida por el usuario. En la esquina inferior derecha de esa ventana, cambie el valor Basado en a “valor de versión”.

Finalmente, vaya a su destino y cree una fase de comstackción Ejecutar script. Inspeccione esa fase del script de ejecución y pegue su script en el campo de texto del script. Por ejemplo, mi secuencia de comandos para etiquetar mi configuración BUILD_NUMBER con la versión actual de Subversion es la siguiente:

 REV=`/usr/bin/svnversion -nc ${PROJECT_DIR} | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'` echo "BUILD_NUMBER = $REV" > ${PROJECT_DIR}/buildnumber.xcconfig 

Esto debería hacer el truco de reemplazar la variable cuando estos valores cambien dentro de su proyecto.