Versión vs compilación en Xcode

Tengo una aplicación que desarrollé con Xcode 3 y recientemente comencé a editar con Xcode 4. En el resumen de destino, tengo el formulario de destino de la aplicación iOS con campos: identificador, versión, compilación, dispositivos y destino de implementación. El campo de la versión está en blanco y el campo de compilación es 3.4.0 (que coincide con la versión de la aplicación de cuando todavía estaba editando con Xcode 3).

Mis preguntas son las siguientes:

  1. ¿Cuál es la diferencia entre los campos de versión y de compilación?

  2. ¿Por qué el campo de la versión estaba en blanco después de actualizar a Xcode 4?

preguntado el 27 de julio de 11 a las 18:07

Por un lado, creo que es el número de compilación que aparece en la lista de archivos de Xcode Organizer. Aparte de eso, no estoy seguro de para qué se usa. -

7 Respuestas

Apple reorganizó / reutilizó los campos.

En el futuro, si busca en la pestaña Información para su objetivo de aplicación, debe usar la "Cadena de versiones del paquete, corta" como su Versión (por ejemplo, 3.4.0) y la "Versión del paquete" como su Compilación (por ejemplo, 500 o 1A500 ). Si no los ve a ambos, puede agregarlos. Estos se asignarán a los cuadros de texto de Versión y Compilación adecuados en la pestaña Resumen; son los mismos valores.

Al ver la pestaña Información, si hace clic con el botón derecho y selecciona Mostrar claves / valores sin procesar, verá que los nombres reales son CFBundleShortVersionString (Versión) y CFBundleVersion (Construir).

La versión se usa generalmente como parece que la ha estado usando con Xcode 3. No estoy seguro de a qué nivel está preguntando acerca de la diferencia de versión / compilación, así que la responderé filosóficamente.

Hay todo tipo de esquemas, pero uno popular es:

{MajorVersion}. {MinorVersion}. {Revision}

  • Versión mayor - Cambios importantes, rediseños y cambios de funcionalidad.
  • Versión menor - Mejoras menores, adiciones a la funcionalidad.
  • Revisión - Un número de parche para corregir errores

Luego, la compilación se usa por separado para indicar el número total de compilaciones para una versión o para toda la vida útil del producto.

Muchos desarrolladores comienzan el número de compilación en 0 y cada vez que compilan aumentan el número en uno, aumentando para siempre. En mis proyectos, tengo un script que aumenta automáticamente el número de compilación cada vez que construyo. Vea las instrucciones para eso a continuación.

  • La versión 1.0.0 podría ser la compilación 542. Se necesitaron 542 compilaciones para llegar a la versión 1.0.0.
  • La versión 1.0.1 podría ser la compilación 578.
  • La versión 1.1.0 podría ser la compilación 694.
  • La versión 2.0.0 podría ser la compilación 949.

Otros desarrolladores, incluido Apple, tienen un número de compilación compuesto por una versión principal + versión secundaria + número de compilaciones para el lanzamiento. Estos son los números reales de la versión del software, a diferencia de los valores utilizados para marketing.

Si vas a Xcode menú> Sobre Xcode, verá los números de versión y compilación. Si golpeas el Más información... verá un montón de versiones diferentes. Desde el Más información... El botón se eliminó en Xcode 5, esta información también está disponible en el Software> Desarrollador sección de la Información del sistema aplicación, disponible abriendo Apple menú> Acerca de este Mac > Informe del sistema ....

Por ejemplo, Xcode 4.2 (4C139). La versión de marketing 4.2 es la versión 4 de la compilación principal, la versión secundaria de la compilación C y el número de compilación 139. La próxima versión (presumiblemente 4.3) probablemente será la versión de compilación 4D, y el número de compilación comenzará de nuevo en 0 y se incrementará a partir de ahí.

Los números de versión / compilación del simulador de iPhone son los mismos, al igual que los iPhone, Mac, etc.

  • 3.2: (7W367a)
  • 4.0: (8A400)
  • 4.1: (8B117)
  • 4.2: (8C134)
  • 4.3: (8H7)

Noticias: A pedido, estos son los pasos para crear un script que se ejecute cada vez que compile su aplicación en Xcode para leer el número de compilación, incrementarlo y volver a escribirlo en el {App}-Info.plist expediente. Hay pasos adicionales opcionales si desea escribir sus números de versión / compilación en su Settings.bundle/Root*.plist archivo (s).

Esto se extiende desde el artículo de procedimientos. aquí.

En Xcode 4.2 - 5.0:

  1. Carga tu proyecto de Xcode.
  2. En el panel de la izquierda, haga clic en su proyecto en la parte superior de la jerarquía. Esto cargará el editor de configuración del proyecto.
  3. En el lado izquierdo del panel de la ventana central, haga clic en su aplicación debajo de la OBJETIVOS Bóveda. Deberá configurar esta configuración para cada objetivo del proyecto.
  4. Selecciona el botón Fases de construcción lengüeta.
    • En Xcode 4, en la parte inferior derecha, haga clic en el Agregar fase de construcción botón y seleccione Agregar secuencia de comandos de ejecución.
    • En Xcode 5, seleccione Editora menú> Agregar fase de construcción > Agregar fase de construcción de secuencia de comandos de ejecución.
  5. Arrastra y suelta el nuevo Ejecutar guión fase para moverlo a justo antes de la Copiar recursos del paquete fase (cuando el archivo app-info.plist se incluirá con su aplicación).
  6. En el nuevo Ejecutar guión fase, conjunto Cáscara: /bin/bash.
  7. Copie y pegue lo siguiente en el área del script para números de compilación enteros:

    buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
    buildNumber=$(($buildNumber + 1))
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"
    

    Como señaló @Bdebeez, el Herramienta de control de versiones genérica de Apple (agvtool) también está disponible. Si prefiere usarlo en su lugar, hay un par de cosas que debe cambiar primero:

    • Selecciona el botón Configuración de compilación lengüeta.
    • Bajo la Versiones sección, establezca el Versión actual del proyecto al número de compilación inicial que desea usar, por ejemplo, 1.
    • De vuelta a la Fases de construcción pestaña, arrastre y suelte su Ejecutar guión fase después de la Copiar recursos del paquete fase para evitar una condición de carrera al intentar compilar y actualizar el archivo fuente que incluye su número de compilación.

    Tenga en cuenta que con el agvtool método, es posible que periódicamente obtenga compilaciones fallidas / canceladas sin errores. Por esta razón, no recomiendo usar agvtool con este guión.

    Sin embargo, en tu Ejecutar guión fase, puede utilizar el siguiente script:

    "${DEVELOPER_BIN_DIR}/agvtool" next-version -all
    

    La next-version argumento incrementa el número de compilación (bump es también un alias para lo mismo), y -all actualizaciones Info.plist con el número de nueva construcción.

  8. Y si tiene un paquete de configuración en el que muestra la versión y la compilación, puede agregar lo siguiente al final del script para actualizar la versión y la compilación. Nota: cambie el PreferenceSpecifiers valores para que coincidan con su configuración. PreferenceSpecifiers:2 significa mirar el elemento en el índice 2 debajo de la PreferenceSpecifiers matriz en su archivo plist, por lo que para un índice basado en 0, esa es la tercera configuración de preferencia en la matriz.

    productVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$INFOPLIST_FILE")
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root.plist
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" Settings.bundle/Root.plist
    

    Si estás usando agvtool en lugar de leer el Info.plist directamente, puede agregar lo siguiente a su secuencia de comandos en su lugar:

    buildNumber=$("${DEVELOPER_BIN_DIR}/agvtool" what-version -terse)
    productVersion=$("${DEVELOPER_BIN_DIR}/agvtool" what-marketing-version -terse1)
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root.plist
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" Settings.bundle/Root.plist
    
  9. Y si tiene una aplicación universal para iPad y iPhone, también puede establecer la configuración para el archivo de iPhone:

    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root~iphone.plist    
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" Settings.bundle/Root~iphone.plist
    

Respondido 29 Oct 13, 22:10

"En mis proyectos, tengo una secuencia de comandos que aumenta automáticamente el número de compilación cada vez que construyo". ¿Puedes compartir cómo lo haces? gracias por las respuestas detalladas y por la pregunta original. - Zsolt

@Andrews: actualicé mi respuesta con los detalles del script de compilación. - nekno

Para incrementar en números hexadecimales puede usar buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE") dec=$((0x$buildNumber)) buildNumber=$(($dec + 1)) hex=$(printf "%X" $buildNumber) /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $hex" "$INFOPLIST_FILE" - Alón Amir

En resumen: HEX no está permitido en la AppStore. - Nicolás Miari

(Usuarios de Xcode 5) Es posible que deba cambiar el paso 5 para que lea: "En la barra de menú, seleccione Editor -> Agregar fase de compilación -> Agregar fase de compilación de ejecución de script" - Greg M. Krsak

(Solo dejo esto aquí para mi propia referencia). Esto mostrará la versión y compilación de los campos "versión" y "compilación" que ve en un destino de Xcode:

- (NSString*) version {
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
    return [NSString stringWithFormat:@"%@ build %@", version, build];
}

En Swift

func version() -> String {
    let dictionary = NSBundle.mainBundle().infoDictionary!
    let version = dictionary["CFBundleShortVersionString"] as? String
    let build = dictionary["CFBundleVersion"] as? String
    return "\(version) build \(build)"
}

Respondido 16 Jul 15, 22:07

OT: Tiene una fuga en su método, usted alloc/init la cuerda, que retiene la cuerda, pero no la estás soltando. En un objeto que regresa de un método, generalmente debe usar un método de conveniencia para que la cadena se libere automáticamente automáticamente, o llame autorelease. Ya sea: return [NSString stringWithFormat:@"%@ build %@", version, build]; OR return [[[NSString alloc] initWithFormat:@"%@ build %@", version, build] autorelease]; - nekno

Gracias @nekno, cambié la respuesta para que sea compatible con ARC o no. - dan rosenstark

Probablemente sea mejor usar las constantes donde estén disponibles (por ejemplo, kCFBundleVersionKey), para evitar errores tipográficos. Sin embargo, no pude encontrar uno para "CFBundleShortVersionString" :) - dannya

Tiene un error en el código swift, está llamando a CFBundleShortVersionString dos veces. Yariv Nisim

Gracias @ yar1vn, lo arreglé y NO, no está al revés. - dan rosenstark

El número de compilación es un número interno que indica el estado actual de la aplicación. Se diferencia del número de versión en que normalmente no está orientado al usuario y no denota ninguna diferencia / características / actualizaciones como lo haría normalmente un número de versión.

Piensa en esto, de esta manera:

  • Construir (CFBundleVersion): El número de compilación. Por lo general, comienza en 1 y aumenta en 1 con cada compilación de la aplicación. Permite rápidamente comparaciones de qué compilación es más reciente y denota la sensación de progreso del código base. Estos pueden ser abrumadoramente valiosos cuando se trabaja con QA y se necesita asegurarse de que los errores se registren en las compilaciones correctas.
  • Versión de marketing (CFBundleShortVersionString): El número de cara al usuario que está utilizando para indicar esta versión de su aplicación. Por lo general, esto sigue un esquema de versión Major.minor (por ejemplo, MyAwesomeApp 1.2) para que los usuarios sepan qué versiones son actualizaciones de mantenimiento más pequeñas y cuáles son características nuevas importantes.

Para usar esto de manera efectiva en sus proyectos, Apple proporciona una gran herramienta llamada agvtool. Recomiendo encarecidamente usar esto, ya que es MUCHO más simple que programar cambios de plist. Le permite configurar fácilmente tanto el número de compilación como la versión de marketing. Es particularmente útil al realizar secuencias de comandos (por ejemplo, actualizar fácilmente el número de compilación en cada compilación o incluso consultar cuál es el número de compilación actual). Incluso puede hacer cosas más exóticas como etiquetar su SVN cuando actualice el número de compilación.

Para usarlo:

  • Configure su proyecto en Xcode, en Control de versiones, para usar "Apple Generic".
  • En terminal
    • agvtool new-version 1 (establezca el número de compilación en 1)
    • agvtool new-marketing-version 1.0 (establezca la versión de marketing en 1.0)

Ver la página de manual de agvtool por un montón de buena información

contestado el 23 de mayo de 13 a las 13:05

El script para autoincrementar el número de compilación en la respuesta anterior no funcionó para mí si el número de compilación es un valor de punto flotante, así que lo modifiqué un poco:

#!/bin/bash    
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=`echo $buildNumber +1|bc`
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

Respondido 08 Feb 12, 15:02

El número de lanzamiento de marketing es para los clientes, llamado número de versión. Empieza con 1.0 y sube para actualizaciones importantes de 2.0, 3.0, para actualizaciones menores de 1.1, 1.2 y para corregir errores 1.0.1, 1.0.2 . Este número está orientado a lanzamientos y nuevas funciones.

La Número de construcción es mayormente el número interno de compilaciones que se han realizado hasta entonces. Pero algunos usan otros números como el número de rama del repositorio. Este número debe ser único para distinguir las diferentes construcciones casi iguales.

Como se puede ver, el Número de construcción no es necesario y depende de usted cuál Número de construcción desea utilizar. Entonces, si actualiza su Xcode a una versión mayor, el build el campo está vacío. los versión ¡El campo no puede estar vacío !.


Para obtener el build número como NSString variable:

NSString * appBuildString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];

Para obtener el versión número como NSString variable:

NSString * appVersionString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];

Si desea ambas en uno NSString:

NSString * versionBuildString = [NSString stringWithFormat:@"Version: %@ (%@)", appVersionString, appBuildString];

Esto se prueba con Versión de Xcode 4.6.3 (4H1503). El número de compilación a menudo se escribe entre paréntesis / llaves. El número de compilación está en hexadecimal o decimal.

construido y versión


In Xcode puede incrementar automáticamente el Número de construcción como herramienta de edición del número decimal colocando lo siguiente en el Run script fase de construcción en la configuración del proyecto

#!/bin/bash    
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

Para hexadecimal número de compilación usa este script

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$((0x$buildNumber)) 
buildNumber=$(($buildNumber + 1)) 
buildNumber=$(printf "%X" $buildNumber)
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

configuración_del_proyecto

Respondido 28 Oct 13, 07:10

Gracias a @nekno y @ ale84 por sus excelentes respuestas.

Sin embargo, modifiqué poco el script de @ ale84 para incrementar los números de compilación para el punto flotante.

el valor de incl se puede cambiar de acuerdo con sus requisitos de formato flotante. Por ejemplo: si incl = .01, el formato de salida sería ... 1.19, 1.20, 1.21 ...

buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
incl=.01
buildNumber=`echo $buildNumber + $incl|bc`
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

Respondido 02 Feb 14, 08:02

Otra forma es establecer el número de versión en appDelegate didFinishLaunchingWithOptions:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
     NSString * ver = [self myVersion];
     NSLog(@"version: %@",ver);

     NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
     [userDefaults setObject:ver forKey:@"version"];
     return YES;
}

- (NSString *) myVersion {
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
    return [NSString stringWithFormat:@"%@ build %@", version, build];
}

respondido 29 nov., 19:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.