Pregunta Versión contra construcción en Xcode


Tengo una aplicación que desarrollé con Xcode 3 y recientemente comencé a editar con Xcode 4. En el resumen objetivo, 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 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 cuando aún estaba editando con Xcode 3).

Mis preguntas son: 

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

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


604
2017-07-27 21:48


origen


Respuestas:


Apple reorganizó / reutilizó los campos.

En el futuro, si mira en la pestaña Información para su Objetivo de aplicación, debe usar la "Versión de paquete de cadenas, corta" como su Versión (por ejemplo, 3.4.0) y "Versión del paquete" como su compilación (por ejemplo, 500 o 1A500) ) Si no los ve a ambos, puede agregarlos. Esos mapas 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 derecho y selecciona Mostrar claves sin procesar / valores, verá que los nombres reales son CFBundleShortVersionString (Versión) y CFBundleVersion (Construir).

La Versión generalmente se usa como parece que la has usado con Xcode 3. No estoy seguro de en qué nivel estás preguntando sobre la diferencia Versión / Construcción, así que la responderé filosóficamente.

Hay todo tipo de esquemas, pero uno popular es:

{MajorVersion}. {MinorVersion}. {Revisión}

  • Versión principal - Cambios importantes, rediseños y funcionalidad cambios
  • 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 automáticamente aumenta el número de compilación cada vez que construyo. Vea las instrucciones a continuación.

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

Otros desarrolladores, incluido Apple, tienen un número de Compilación compuesto por una versión principal + versión menor + 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 la comercialización.

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

Por ejemplo, Xcode 4.2 (4C139). La versión 4.2 de marketing es Build major versión 4, Build versión menor C y Build número 139. La próxima versión (presumiblemente 4.3) probablemente será Build 4D, y el número de Build volverá a cero e incrementará desde allí.

Los números de versión / compilación de iPhone Simulator son de la misma manera, al igual que los iPhones, Macs, etc.

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

Actualizar: A pedido, estos son los pasos para crear un script que se ejecute cada vez que construya su aplicación en Xcode para leer el número de compilación, incrementarlo y volver a escribirlo en la aplicación. {App}-Info.plist archivo. Hay pasos adicionales opcionales si quiere 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 cómo hacerlo aquí.

En Xcode 4.2 - 5.0:

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

    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 versión genérica de Apple (agvtool) también está disponible. Si prefieres usarlo en su lugar, entonces hay un par de cosas que cambiar primero:

    • Selecciona el Configuración de compilación lengüeta.
    • Bajo la Versiones sección, establecer el Versión actual del proyecto al número de compilación inicial que desea usar, por ejemplo, 1.
    • De vuelta en el Construir fases pestaña, arrastrar y soltar su Ejecutar guión fase después del Copie los recursos del paquete fase para evitar una condición de carrera cuando intente construir 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 script

    Sin embargo, en su Ejecutar guión fase, puede usar la siguiente secuencia de comandos:

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

    los next-version argumento incrementa el número de compilación (bump es también un alias para la misma cosa), y -all actualizaciones Info.plist con el nuevo número de compilación.

  8. Y si tiene un paquete de Configuraciones donde muestra la Versión y la Creación, puede agregar lo siguiente al final del script para actualizar la versión y la compilación. Nota: Cambiar el PreferenceSpecifiers valores para que coincida con su configuración. PreferenceSpecifiers:2 significa mirar el artículo en el índice 2 debajo del PreferenceSpecifiers array 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:

    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, entonces 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
    

1147
2017-08-06 05:55



(Dejándolo aquí para mi propia referencia.) Esto mostrará la versión y compilación para los campos "versión" y "compilación" que ve en un objetivo 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)"
}

71
2017-09-05 14:18



El número de compilación es un número interno que indica el estado actual de la aplicación. Difiere 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 la construcción. Por lo general, comienza con 1 y aumenta en 1 con cada compilación de la aplicación. Rápidamente permite comparaciones de las cuales la construcción es más reciente y denota la sensación de progreso de la base de código. Estos pueden ser abrumadoramente valiosos cuando se trabaja con QA y es necesario asegurarse de que los errores se registren en las versiones correctas.
  • Versión de comercialización (CFBundleShortVersionString): El número de usuario que está utilizando para denotar 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 de gran importancia.

Para usar esto de manera efectiva en sus proyectos, Apple ofrece una excelente herramienta llamada agvtool. Recomiendo utilizar esto, ya que es MUCHO más simple que la creación de scripts de cambios plist.  Le permite establecer fácilmente tanto el número de compilación como la versión de marketing. Es particularmente útil al crear scripts (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 tu SVN cuando actualizas el número de compilación.

Para usarlo:

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

Ver la página man de agvtool por una tonelada de buena información


47
2017-12-24 01:37



La secuencia de comandos 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, por lo 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"

25
2018-02-08 15:47



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

los número de compilación es principalmente el número interno de compilacionesque se han hecho hasta entonces. Pero algunos usan otros números como el número de rama del depósito. Este número debe ser único para distinguir las diferentes casi las mismas construcciones.

Como puedes ver, el número de compilación no es necesario y depende de usted número de compilación quieres usar Entonces, si actualizas tu Xcode a una versión principal, el construir el campo esta vacio los versión el campo puede no estar vacío !.


Para obtener el construir 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 tu quieres ambos en uno NSString:

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

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

buildandversion


En Xcode puedes auto incrementar el número de compilación como un 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"

por hexadecimal número de compilación use esta secuencia de comandos

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"

project_settings


21
2017-10-28 07:33



Gracias a @nekno y @ ale84 por excelentes respuestas.

Sin embargo, modifiqué el guión de @ ale84 poco para incrementar los números de compilación para coma 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"

6
2018-02-02 08:14



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];
}

1
2018-01-17 15:05