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


91

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 configuración de mi aplicación.

El archivo Root.plist contiene un fragmento como este ...

     <dict>
        <key>Type</key>
        <string>PSTitleValueSpecifier</string>
        <key>Title</key>
        <string>Version</string>
        <key>Key</key>
        <string>version_preference</string>
        <key>DefaultValue</key>
        <string>VersionValue</string>
        <key>Values</key>
        <array>
            <string>VersionValue</string>
        </array>
        <key>Titles</key>
        <array>
            <string>VersionValue</string>
        </array>
    </dict>

y me gustaría reemplazar la cadena "VersionValue" en el momento de la compilación.

Tengo un script que puede extraer el número de versión de mi repositorio, lo que necesito es una forma de procesar (preprocesar) el archivo Root.plist, en el momento de la compilación, y reemplazar el número de revisión sin afectar el archivo fuente.

Respuestas:


69

Existe 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 dentro de la mayoría de sus instaladores y la ha incluido en Leopard en /usr/libexec/PlistBuddy.

Como desea reemplazar VersionValue, asumiendo que tiene el valor de la versión extraído $newVersion, puede 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 del manual para obtener instrucciones detalladas. Puede utilizar PlistBuddy para agregar, eliminar o modificar cualquier entrada en una lista de propiedades. Por ejemplo, un amigo mío escribió en su blog sobre cómo incrementar los números de compilación en Xcode usando PlistBuddy.

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


20
Me parece un rato descubrir la forma correcta de referirme al número de versión en mi plist; en mi caso resultó ser / usr / libexec / PlistBuddy Settings.bundle / Root.plist -c "set PreferenceSpecifiers: 0: DefaultValue $ newversion" - espero que sea útil para otras personas.
JosephH

Quinn Taylor, JosephH, gracias a sus respuestas, pude implementar automáticamente el número de versión de mi aplicación en el paquete Settings.bundle. +1 para los dos ;-)
Niko

7
Desde una fase de compilación personalizada "Ejecutar script", necesitaba incluir más de la ruta a Root.plist: / usr / libexec / PlistBuddy $ {TARGET_BUILD_DIR} / $ {FULL_PRODUCT_NAME} /Settings.bundle/Root.plist -c "set PreferenceSpecifiers: 0: DefaultValue $ newVersion "
Chris Vasselli

2
Solo para completar, aquí hay otro enfoque con PListBuddy que funcionó para mí: xcodehelp.blogspot.com/2012/05/…
koen

la forma más correcta es/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:0:DefaultValue ${newVersion}" "${TARGET_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/Settings.bundle/Root.plist"
kambala

66

La solución de mi vago fue actualizar el número de versión del código de mi aplicación. Podría 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"];

El único inconveniente es que su aplicación tendría que ejecutarse al menos una vez para que la versión actualizada aparezca en el panel de configuración.

Puede llevar la idea más allá y actualizar, por ejemplo, un contador de cuántas veces se ha lanzado su aplicación u otra información interesante.


9
Esto funcionará excepto si el usuario ingresa a Configuración antes de iniciar su aplicación.
Moshe

9
@Moshe True, pero para manejar esto con elegancia, simplemente puede especificar un valor predeterminado dentro del archivo .plist, tal vez algo como 'Aún no lanzado'
Carlos P

1
aunque la mayoría de los desarrolladores probablemente establecen CFBundleShortVersionStringy CFBundleVersioncon el mismo valor, CFBundleShortVersionStringes en realidad lo que Apple quiere que usted considere que su lanzado la versión , que sería lo que muestran a los usuarios. CFBundleVersionpotencialmente podría ser un número de versión interno, que probablemente no debería mostrar a los usuarios (si es diferente).
Nate

3
¿Me estoy perdiendo de algo? Esto es EXACTAMENTE lo que estoy haciendo, pero el valor no cambia. ¿Ustedes no están usando una propiedad de Título, que creo que es de solo lectura?
Sansón

2
También hay otro problema al actualizar la aplicación. El paquete de configuración seguiría mostrando la versión de compilación anterior hasta que se inicie la aplicación actualizada al menos una vez.
Legoless

61

Según la respuesta de @ Quinn, aquí el proceso completo y el código de trabajo que utilizo para hacer esto.

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

Reemplaza el contenido 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">
<plist version="1.0">
<dict>
    <key>PreferenceSpecifiers</key>
    <array>
        <dict>
            <key>Title</key>
            <string>About</string>
            <key>Type</key>
            <string>PSGroupSpecifier</string>
        </dict>
        <dict>
            <key>DefaultValue</key>
            <string>DummyVersion</string>
            <key>Key</key>
            <string>version_preference</string>
            <key>Title</key>
            <string>Version</string>
            <key>Type</key>
            <string>PSTitleValueSpecifier</string>
        </dict>
    </array>
    <key>StringsTable</key>
    <string>Root</string>
</dict>
</plist>
  • Cree una fase de construcción de Ejecutar script , muévala después de la fase Copiar recursos del 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 real de su aplicación, y el 1 después de PreferenceSpecifiers para ser el índice de su entrada de Versión en la Configuración. El ejemplo anterior de Root.plist lo tiene en el índice 1.


Creo que esta es la mejor manera de hacerlo
Tony

Intenté esto y veo que el valor del Título cambia en mi paquete de configuración. El título aparece en InAppSettingsKit, pero el valor no cambia con respecto a la versión inicial. El título nunca aparece en la aplicación Configuración. Me estoy rindiendo y solo voy a abrir un cuadro de diálogo cuando el usuario seleccione 'Acerca de' en un menú '
bugloaf

Cuando se utiliza este método, la configuración no es de solo lectura. es decir, puedo acceder a la configuración del número de versión en settings.app y es editable.
motionpotion

8
El script de bash que puso @ ben-clayton no funcionó para mí, así que lo rehago en base a su respuesta, aquí está:buildVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "${PROJECT_DIR}/${INFOPLIST_FILE}") /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:3:DefaultValue $buildVersion" "${SRCROOT}/Settings.bundle/Root.plist"
Luis Ascorbe

1
que puede usar ${INFOPLIST_PATH}para la ruta de información plist
Tomer Even

23

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

Agregue Run scriptcon el siguiente fragmento después 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"

Añadiendo CFBundleVersionademás de CFBundleShortVersionString. Emite una versión como esta:

Escribiendo a en $CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist lugar de uno en $SRCROOTtiene algunos beneficios.

  1. No modifica archivos en la copia de trabajo del repositorio.
  2. No es necesario a la ruta caso Settings.bundleen $SRCROOT. El camino puede variar.

Prueba en Xcode 7.3.1


1
En mi opinión, esta es la mejor respuesta si agrega el script a la sección Compilación, acciones previas del esquema del proyecto. Mira la respuesta de Andy.
Vahid Amiri

2
Esto es trabajo para mí. Solo recuerde cambiar "DefaultValue" para que sea específico para usted. Por ejemplo, quería cambiar el pie de página, así que usé "FooterText". También necesita cambiar el número después de "PreferenceSpecifiers" para que se correlacione con el elemento en la lista.
Richard Witherspoon

12

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

#! /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)

Aquí está 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">
<plist version="1.0">
<dict>
    <key>PreferenceSpecifiers</key>
    <array>
        <dict>
            <key>Title</key>
            <string>About</string>
            <key>Type</key>
            <string>PSGroupSpecifier</string>
        </dict>
        <dict>
            <key>DefaultValue</key>
            <string>1.0.0.0</string>
            <key>Key</key>
            <string>version_preference</string>
            <key>Title</key>
            <string>Version</string>
            <key>Type</key>
            <string>PSTitleValueSpecifier</string>
        </dict>
    </array>
    <key>StringsTable</key>
    <string>Root</string>
</dict>
</plist>

Muy útil: tengo problemas para ejecutar PlistBuddy desde Python, y nunca hubiera pensado en usar NSDictionary(y tampoco me di cuenta de que le brindaba un acceso tan fácil a los archivos plist)
Dov

Gracias por esto. Una modificación, como la tiene ahora, hace un cambio en la fuente, no en el builddir, lo que significa que lo que ve en su dispositivo o en el simulador siempre será una versión de compilación detrás de la versión de compilación real. Para solucionar esto, modifiqué su script para iterar primero sobre la fuente, luego también el builddir, es decir. settings_path_build = os.path.join (os.environ.get ('TARGET_BUILD_DIR'), settings_file_path_build)
xaphod

... y también, agrego el githash:gitHash = subprocess.check_output(["git", "rev-parse", "--short", "HEAD"]).rstrip()
xaphod

8

Las otras respuestas no funcionan correctamente por una razón: la fase de ejecución del script no se ejecuta hasta DESPUÉS de que se haya empaquetado el paquete de configuración. Por lo tanto, si su versión de Info.plist es 2.0.11 y la actualiza a 2.0.12, luego compile / archive su proyecto, el paquete de Configuración 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 compilación. Puede compilar el proyecto OTRA VEZ para actualizar correctamente el paquete de configuración, o puede agregar el script a una fase previa a la compilación en su lugar ...

  • En XCode, edite el esquema para el objetivo de su proyecto
  • Haga clic en la flecha de divulgación en el esquema CONSTRUIR
  • Luego, haga clic en el elemento "Acciones previas"
  • Haga clic en el signo más y seleccione "Nueva acción de ejecución de secuencia de comandos".
  • Establecer el valor de shell en / bin / sh
  • Establezca "Proporcionar configuración de compilación desde" en el objetivo de su proyecto
  • Agregue su secuencia de comandos al área de texto. El siguiente guión 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 "Imprimir 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 empaquetar el paquete de configuración durante el proceso de compilación / archivo. Si abre el paquete de configuración Root.plist y compila / archiva su proyecto, ahora verá que el número de versión se actualiza al comienzo del proceso de compilación y su paquete de configuración mostrará la versión correcta.


Gracias, solo su solución muestra la versión de compilación correcta. Otras soluciones necesarias para construir dos veces.
Boris Y.20 de

Esto todavía requería una segunda compilación para mí, usando Xcode 10.0
Patrick

@Patrick La aplicación de configuración de iOS a veces conserva información antigua. Para ver el cambio, debe eliminar y reiniciar la aplicación Configuración.
Andy

1
Por cierto, encontré una forma más sencilla de agregar este script: Vaya a la pestaña Build Phases del objetivo de su proyecto y haga clic en el icono "+". Elija "Nueva fase de ejecución de secuencia de comandos" y agregue el código de secuencia de comandos allí. ESTA ES LA CLAVE: haga clic y arrastre el nuevo script de ejecución a la parte superior de la lista Fases de compilación, en Dependencias de destino, pero antes de Compilar fuentes. Esto se comportará de la misma manera que un script preconstruido y es más fácil de encontrar.
Andy

Gracias @Andy, su solución de agregar a la pestaña Build Phases funcionó perfectamente.
Patrick

7

Con Xcode 11.4, puede utilizar los siguientes pasos para mostrar la versión de la aplicación en el paquete de configuración de su aplicación.


Conjunto $(MARKETING_VERSION)y $(CURRENT_PROJECT_VERSION)variables

Nota: si las variables $(MARKETING_VERSION)y $(CURRENT_PROJECT_VERSION)aparecen para las teclas Bundle version string (short)y Bundle versionen Info.plist , puede omitir los siguientes pasos y pasar a la siguiente sección.

  1. Abra el proyecto Xcode.
  2. Abra Project Navigator ( cmd1), seleccione su proyecto para revelar la configuración de su proyecto y luego seleccione el destino de la aplicación.
  3. Seleccione la pestaña General .
  4. En la sección Identidad , cambie el contenido del campo Versión a algún valor nuevo (p 0.1.0. Ej. ) Y cambie el contenido del campo Construir a algún valor nuevo (p 12. Ej .). Estos 2 cambios crearán $(MARKETING_VERSION)y $(CURRENT_PROJECT_VERSION)variables en el archivo Info.plist .

Crear y configurar el paquete de ajustes

  1. En el Navegador de proyectos , seleccione su proyecto.
  2. Seleccione Archivo > Nuevo > Archivo… ( cmdN).
  3. Seleccione la pestaña iOS .
  4. Seleccione Paquete de configuración en la sección Recursos , luego haga clic en Siguiente y en Crear .
  5. Seleccione Root.plist y ábralo como código fuente. Reemplace su contenido con el siguiente código:
<?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>PreferenceSpecifiers</key>
    <array>
        <dict>
            <key>DefaultValue</key>
            <string></string>
            <key>Key</key>
            <string>version_preference</string>
            <key>Title</key>
            <string>Version</string>
            <key>Type</key>
            <string>PSTitleValueSpecifier</string>
        </dict>
    </array>
    <key>StringsTable</key>
    <string>Root</string>
</dict>
</plist>

Agregar un script de ejecución

  1. En el Navegador de proyectos , seleccione su proyecto.
  2. Seleccione el destino de la aplicación.
  3. Seleccione la pestaña Build Phases .
  4. Haga clic en + > Nueva fase de ejecución del script .
  5. Arrastre y suelte la nueva fase en algún lugar encima de la sección Copiar recursos del paquete . De esta forma, el script se ejecutará antes de compilar la aplicación.
  6. Abra la fase Ejecutar script recién agregada y agregue el siguiente script:
version="$MARKETING_VERSION"
build="$CURRENT_PROJECT_VERSION"
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version ($build)" "${SRCROOT}/Settings.bundle/Root.plist"

Ejecutar aplicación

  1. Ejecute el producto ( cmdR) en el dispositivo o simulador.
  2. En el dispositivo o simulador, una vez que se inicia la aplicación, abra la aplicación Configuración y seleccione su aplicación en la lista de aplicaciones de terceros. La versión de la aplicación debe mostrarse como se muestra a continuación:


Fuentes


Esto arroja un error para míSet: Entry, "PreferenceSpecifiers:0:DefaultValue", Does Not Exist
Jordan H

2
Esto funcionó para mí:/usr/libexec/PlistBuddy "$SRCROOT/AppName/Settings.bundle/Root.plist" -c "set PreferenceSpecifiers:0:DefaultValue $version"
Jordan H

Gracias. Este es el mundo para mí. Pero el mío se llamó Settings-Watch.bundle y eliminó el($build)
Kurt Lane

3

Logré hacer lo que quería usando el proyecto de código abierto pListcompiler ( http://sourceforge.net/projects/plistcompiler ).

  1. Con este compilador puede escribir el archivo de propiedades 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. Tuve una fase de compilación de script de ejecución personalizada que extraía la revisión de mi repositorio 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. Entonces pude hacer referencia a la variable kRevisionNumber agregando la siguiente directiva

    #include "Revision.h"
    
  4. También agregué una fase de compilación de script personalizado a mi destino xcode para ejecutar el compilador plcompiler cada vez que el proyecto se está compilando

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

¡Y eso fue todo!


Parece mucho trabajo reemplazar un solo valor en un archivo plist ... Conceptualmente es genial poder acceder a una variable al construir un plist, pero es mucho más fácil usar una herramienta para construir un archivo plist. Describo PlistBuddy en mi respuesta, ¡pruébalo!
Quinn Taylor

3

Mi ejemplo de trabajo basado en la respuesta de @Ben Clayton y los comentarios de @Luis Ascorbe y @Vahid Amiri:

Nota: este enfoque modifica el archivo Settings.bundle / Root.plist en la copia de trabajo del repositorio

  1. Agregue un paquete de configuración a la raíz de su proyecto. No le cambie el nombre

  2. Abra Settings.bundle / Root.plist como SourceCode

    Reemplaza el contenido 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">
    <plist version="1.0">
    <dict>
        <key>PreferenceSpecifiers</key>
        <array>
            <dict>
                <key>DefaultValue</key>
                <string></string>
                <key>Key</key>
                <string>version_preference</string>
                <key>Title</key>
                <string>Version</string>
                <key>Type</key>
                <string>PSTitleValueSpecifier</string>
            </dict>
        </array>
        <key>StringsTable</key>
        <string>Root</string>
    </dict>
    </plist>
    
  3. Agregue la siguiente secuencia de comandos a la sección Compilación, acciones previas del esquema del proyecto (objetivo)

    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:0:DefaultValue $version ($build)" "${SRCROOT}/Settings.bundle/Root.plist"
    
  4. Construye y ejecuta el esquema actual


2

Las respuestas anteriores no funcionaron para mí, por lo tanto, creé mi script personalizado.

Esto actualiza dinámicamente la entrada de Root.plist

Utilice ejecutar el script a continuación. Funcionará con seguridad verificado en xcode 10.3.

"var buildVersion" es la versión que se mostrará en el título.

Y el nombre del identificador es "versión var" a continuación para el título en settings.bundle Root.plist

cd "${BUILT_PRODUCTS_DIR}"

#set version name to your title identifier's string from settings.bundle
var version = "Version"

#this will be the text displayed in title
longVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${INFOPLIST_PATH}")
shortVersion=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" ${TARGET_BUILD_DIR}/${INFOPLIST_PATH})
buildVersion="$shortVersion.$longVersion"

path="${WRAPPER_NAME}/Settings.bundle/Root.plist"

settingsCnt=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:" ${path} | grep "Dict"|wc -l`

for (( idx=0; idx<$settingsCnt; idx++ ))
do
#echo "Welcome $idx times"
val=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:${idx}:Key" ${path}`
#echo $val

#if ( "$val" == "Version" )
if [ $val == "Version" ]
then
#echo "the index of the entry whose 'Key' is 'version' is $idx."

# now set it
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:${idx}:DefaultValue $buildVersion" $path

# just to be sure that it worked
ver=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:${idx}:DefaultValue" $path`
#echo 'PreferenceSpecifiers:$idx:DefaultValue set to: ' $ver

fi

done

Entrada de ejemplo en Root.plist

    <dict>
        <key>Type</key>
        <string>PSTitleValueSpecifier</string>
        <key>Title</key>
        <string>Version</string>
        <key>DefaultValue</key>
        <string>We Rock</string>
        <key>Key</key>
        <string>Version</string>
    </dict>

Ejemplo de trabajo de entrada Root.plist


1

Creo que puede hacer esto de una manera similar a la que describo en esta respuesta (basada en esta publicación ).

Primero, puede hacer de VersionValue una variable dentro de Xcode cambiándola de nombre a $ {VERSIONVALUE}. Cree un archivo llamado versionvalue.xcconfig y agréguelo a su proyecto. Vaya al destino de su aplicación y vaya a la configuración de compilación para ese destino. Creo que debe agregar VERSIONVALUE como configuración de compilación definida por el usuario. En la esquina inferior derecha de esa ventana, cambie el valor Basado en a "versionvalue".

Finalmente, vaya a su objetivo y cree una fase de construcción Ejecutar script. Inspeccione la fase Ejecutar script y pegue su script dentro del campo de texto Script. Por ejemplo, mi secuencia de comandos para etiquetar mi configuración BUILD_NUMBER con la compilació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 cambian dentro de su proyecto.


Esto funciona si quiero incrustar el número de versión en el archivo Info.plist. Pero no puedo hacer que funcione para otros archivos plist, por ejemplo, el archivo Root.plist que se encuentra en Settings.bundle. ¿Existe una configuración de compilación que pueda usar para habilitar esto?
Panagiotis Korros

0

Para mí, esta fue la solución más fácil:

Agregue una nueva fase de compilación del script antes del paso Copiar recursos del paquete

Cáscara: /usr/bin/env python

Contenido:

#! /usr/bin/env python
import os
from AppKit import NSMutableDictionary

# Key to replace
settings_key = 'version_preference' # the key of your settings version

# File path
settings_path = os.environ.get('SRCROOT') + "/TheBeautifulNameOfYourOwnApp/Settings.bundle/Root.plist"

# Composing version string
version_string = os.environ.get('MARKETING_VERSION') + " (" + os.environ.get('CURRENT_PROJECT_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'] = version_string

# Save new settings
settings_plist.writeToFile_atomically_(settings_path, True)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.