program notes for downloads developer desarrollador cuenta apple ios xcode

ios - notes - xcode 10 requirements



VersiĆ³n vs compilaciĆ³n en Xcode (7)

Tengo una aplicación que desarrollé con Xcode 3 y comencé recientemente 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 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:

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

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


(Solo dejo esto aquí para mi propia referencia). Esto mostrará la versión y la compilación de los campos "versión" y "compilación" que verá 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)" }


Apple tipo de reorganizar / reutilizar los campos.

En el futuro, si busca en la pestaña Información de 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 los dos, puede agregarlos. Esos se asignarán a los cuadros de texto de Versión y Creació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 (compilación).

La versión se usa normalmente como parece que la estuviste usando con Xcode 3. No estoy seguro en qué nivel estás preguntando sobre 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 principal: 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 la corrección de errores

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

Muchos desarrolladores inician el número de compilación en 0, y cada vez que construyen aumentan el número en uno, aumentando para siempre. En mis proyectos, tengo una secuencia de comandos 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 una 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 que consta de 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 la comercialización.

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

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

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

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

Actualización : A solicitud, aquí están los pasos para crear un script que se ejecute cada vez que genere su aplicación en Xcode para leer el número de compilación, incrementarlo y volver a escribirlo en el archivo {App}-Info.plist . Hay pasos opcionales adicionales si desea escribir sus números de versión / compilación en sus archivos Settings.bundle/Root*.plist .

Esto se extiende desde el artículo de cómo hacerlo here .

En Xcode 4.2 - 5.0:

  1. Carga tu proyecto 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 central de la ventana, haga clic en su aplicación debajo del encabezado OBJETIVOS . Deberá configurar esta configuración para cada objetivo del proyecto.
  4. Seleccione la pestaña Build Phases .
    • En Xcode 4, en la parte inferior derecha, haga clic en el botón Agregar fase de compilación y seleccione Agregar secuencia de comandos de ejecución .
    • En Xcode 5, seleccione el menú Editor > Agregar fase de compilación > Agregar fase de compilación de secuencia de comandos de ejecución .
  5. Arrastre y suelte la nueva fase del script de ejecución para moverla justo antes de la fase de copiar los recursos del paquete (cuando el archivo app-info.plist se incluirá en la aplicación).
  6. En la nueva fase Ejecutar script , establezca Shell : /bin/bash .
  7. Copie y pegue lo siguiente en el área de script para los números de compilación de 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, también está disponible la herramienta de agvtool genérica de Apple ( agvtool ). Si prefieres usarlo en su lugar, primero hay que cambiar un par de cosas:

    • Seleccione la pestaña Configuración de compilación .
    • En la sección Control de versiones , configure la versión actual del proyecto con el número de compilación inicial que desea usar, por ejemplo, 1 .
    • De vuelta en la pestaña Fases de compilación , arrastre y suelte la fase Ejecutar guión después de la fase de Copiar recursos de paquete para evitar una condición de carrera al intentar compilar y actualizar el archivo de origen que incluye su número de compilación.

    Tenga en cuenta que con el método agvtool todavía puede obtener periódicamente compilaciones fallidas / canceladas sin errores. Por esta razón, no recomiendo usar agvtool con este script.

    Sin embargo, en la fase de ejecución del script , puede utilizar el siguiente script:

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

    El next-version argumento de la next-version incrementa el número de compilación (el bump también es 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 Configuración donde se muestra la Versión y Compilación, puede agregar lo siguiente al final de la secuencia de comandos para actualizar la versión y compilar. Nota: Cambie los valores de PreferenceSpecifiers para que coincidan con su configuración. PreferenceSpecifiers:2 significa mirar el elemento en el índice 2 debajo de la matriz PreferenceSpecifiers 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á utilizando agvtool lugar de leer la 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, también puede establecer la configuración del 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


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 la versión en que normalmente no se enfrenta 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:

  • Build ( CFBundleVersion ): El número de la compilación. Por lo general, comienza esto 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 el sentido de progreso del código base. Estos pueden ser abrumadoramente valiosos cuando se trabaja con control de calidad y es necesario asegurarse de que los errores se registren en las compilaciones correctas.
  • Versión de marketing ( 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 nuevas características de gran importancia.

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 los cambios de secuencia de comandos para hacer cambios. Le permite configurar fácilmente el número de compilación y la versión de marketing. Es particularmente útil cuando se realizan 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 para usted cuando actualiza el número de compilación.

Para usarlo:

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

Vea la página de agvtool de agvtool para una tonelada de buena información


El número de lanzamiento de marketing es para los clientes, llamado número de versión . Comienza con 1.0 y sube para actualizaciones mayores 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 sobre lanzamientos y nuevas características.

El número de compilación es principalmente el número interno de compilaciones que se han realizado hasta entonces. Pero algunos usan otros números como el número de sucursal del repositorio. Este número debe ser único para distinguir las diferentes compilaciones casi iguales.

Como puede ver, el número de compilación no es necesario y depende de usted qué número de compilación desea utilizar. Entonces, si actualiza su Xcode a una versión principal, el campo de compilación está vacío. El campo de versión no puede estar vacío !.

Para obtener el número de compilación como una variable NSString :

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

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

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

Si quieres ambas en una NSString :

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

Esto se prueba con Xcode versión 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 en hexadecimal o decimal.

En Xcode puede incrementar automáticamente el número de compilación como un número decimal colocando lo siguiente en la fase de compilación Run script 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 el número de compilación hexadecimal use 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"


Gracias a @nekno y @ ale84 por las grandes respuestas.

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

el valor de incl puede cambiarse 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"


La secuencia de comandos para autoincrementar el número de compilación en la respuesta anterior no me funcionó 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"


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