¿Qué valores debo usar para CFBundleVersion y CFBundleShortVersionString?

98

Este es mi primer envío de aplicación para iOS y no quiero que mi aplicación sea rechazada.

Esto es de Apple Docs:

CFBundleVersion (String: iOS, OS X) especifica el número de versión de compilación del paquete, que identifica una iteración (publicada o no publicada) del paquete. El número de versión de compilación debe ser una cadena compuesta por tres enteros separados por puntos no negativos, siendo el primer entero mayor que cero. La cadena solo debe contener caracteres numéricos (0-9) y punto (.). Los ceros iniciales se truncan de cada entero y se ignorarán (es decir, 1.02.3 es equivalente a 1.2.3). Esta clave no es localizable.

CFBundleShortVersionString (String - iOS, OS X) especifica el número de versión de lanzamiento del paquete, que identifica una iteración lanzada de la aplicación. El número de versión de lanzamiento es una cadena compuesta por tres números enteros separados por puntos. El primer número entero representa revisiones importantes de la aplicación, como revisiones que implementan nuevas funciones o cambios importantes. El segundo número entero denota revisiones que implementan características menos prominentes. El tercer número entero representa las versiones de mantenimiento.

El valor de esta clave difiere del valor de "CFBundleVersion", que identifica una iteración (publicada o no publicada) de la aplicación. Esta clave se puede localizar incluyéndola en sus archivos InfoPlist.strings.

Pero parece un poco extraño. Mi interpretación para esto es poner ambos valores iguales, es decir:

CFBundleVersion: 1.0.0
CFBundleShortVersionString: 1.0.0

¿Alguien puede confirmar al 100% que es lo que se supone que debo poner?

Bbx
fuente
1
De acuerdo con eso, CFBundleShortVersionString se puede localizar. Pero si tiene que ser tres enteros separados por puntos, ¿qué localización es posible?
Rick
@Rick Supongo que eso significa que puede convertirlo para idiomas que en realidad tienen diferentes números, como el árabe.
shiser
@shiser Para ser pedante, los "números arábigos" son en realidad los números que usamos en el mundo occidental, y también en la mayoría de otros lugares. Pero entiendo lo que quieres decir, y hay algunas partes del mundo árabe que no usan "números arábigos". en.wikipedia.org/wiki/Arabic_numerals
RenniePet
1
Otra respuesta aquí. stackoverflow.com/q/21125159/419348
AechoLiu

Respuestas:

77

Piénselo de esta manera: la "versión corta" ( CFBundleShortVersionString) es el número de versión pública. La "versión" ( CFBundleVersion) es más un número de versión interno que podría cambiar con mucha más frecuencia que la "versión corta" pública. Personalmente uso lo mismo para ambos, pero mucha gente actualiza la "versión" en cada compilación. De cualquier manera, normalmente actualiza la "versión corta" cuando la lanza a Apple. La frecuencia con la que actualice la "versión" depende de usted y de sus necesidades.

rmaddy
fuente
14
Tenga en cuenta que la versión del paquete (CFBundleVersion) debe superar numéricamente la versión del paquete de su aplicación anterior o obtendrá un error al enviarla a la App Store. Consulte stackoverflow.com/questions/4933093/… .
Phil
3
De manera similar a lo que Phil dice anteriormente, hoy en día, si vuelve a enviar una compilación fallida (no aprobada por la App Store), parece que necesita agregar CFBundleVersion en cada envío ahora , por lo que es probable que estos números difieran a menos que siempre sea perfecto. o no le importa subir su número de versión pública (CFBundleShortVersionString) ante cualquier cambio necesario para el envío exitoso a la App Store.
likethesky
106

CFBundleShortVersionString le brinda la versión de su aplicación. Por lo general, se incrementa cada vez que publica su aplicación en la App Store. Esta es la versión que está visible en la sección "Versión" de la página App Store de su aplicación.

CFBundleVersion le proporciona el número de compilación que se utiliza para el desarrollo y las pruebas, es decir, con fines "técnicos". El usuario final rara vez está interesado en el número de compilación, pero durante el desarrollo es posible que deba saber qué se está desarrollando y arreglando en cada compilación. Por lo general, esto se incrementa en cada iteración de la versión interna. Y puede usar herramientas de integración continua como Jenkins para incrementar automáticamente el número de compilación en cada compilación.

Números de versión y compilación

Los dos números no dependen el uno del otro, pero es una buena idea mantenerlos paralelos para evitar confusiones. Tenga en cuenta que una vez que su aplicación haya pasado la revisión de la App Store, debe incrementar el número de compilación como lo han dicho Phil y likeTheSky, independientemente de si la publica o no.

Caso de uso: digamos que tiene una compilación bien probada, lista para enviar. Su número de versión es 1.0.0 y el número de compilación es 1.0.0.32 . Una vez que envíe su aplicación, debe actualizar la versión como 1.0.1 y el número de compilación como 1.0.1.0 .

Yunus Nedim Mehel
fuente
4
Entonces, ¿es seguro ignorar ese bit en los documentos (citado en la pregunta) acerca de que CFBundleVersion es " tres " valores separados por períodos?
big_m
Creo que depende de ti. Si no publica una versión con frecuencia o si no necesita seguir estrictamente las correcciones de errores a través de ciclos de prueba frecuentes; también podría utilizar 3 dígitos para ambos.
Yunus Nedim Mehel
entonces, ¿CFBundleVersion puede ser 0 para la compilación de una tienda de aplicaciones? ¿Apple lo rechazará?
kraftydevil
3
Sí, puede utilizar valores distintos de 3 números con puntuación. He utilizado un valor de fecha y hora, como 201606070620en una aplicación iOS de envío.
Basil Bourque
3
@BasilBourque, si no sigue las pautas, puede tener un problema si usa compras dentro de la aplicación. Ver nota técnica 2413
DanSkeel
16

La respuesta de rmaddy es correcta. Agregaré dos pensamientos más.

Número de la tercera versión

Tenga en cuenta el número de la tercera versión, especificado en el sitio web iTunesConnect como parte de la definición de su aplicación. Si ese número es diferente a los dos en Xcode, Apple le da una advertencia. Puede ignorar la advertencia, ya que no es un impedimento (no es un "error").

Fecha y hora como versión

Además, no es necesario utilizar tres números con puntuación. Eso puede tener sentido para algunas aplicaciones, donde tradicionalmente los cambios en el primer número indicaban algún tipo de cambio dramático que generalmente afecta la compatibilidad.

Para otras aplicaciones, es posible que desee utilizar simplemente un valor de fecha y hora en el estilo de formato estándar ISO 8601 (AAAAMMDDHHMM). Por ejemplo 201606070620,. Ese orden de año-mes-fecha-hora-minuto representa un número cada vez mayor, siempre con la misma longitud debido al relleno cero, que cuando se ordena alfabéticamente también es cronológico.

He utilizado con éxito este estilo de números de versión en una aplicación iOS de envío que funciona en iOS 7, 8 y 9.

Incluso puede automatizar la generación de este valor. En su proyecto de Target> Build Phases> Run ScriptPanel:

  1. Especifique en el Shellcampo:/bin/sh
  2. Pegue el siguiente script de 5 líneas que se ve a continuación.
  3. (opcional) Marque la Show environment variables in build logcasilla de verificación.
  4. Desmarque la Run script only when installingcasilla de verificación.

Cada vez que realiza una compilación, se captura la fecha y hora actual en la zona horaria UTC . La -ubandera en el script hace uso de UTC en lugar de su zona horaria predeterminada actual. Generalmente, es mejor para los programadores y administradores de sistemas usar y pensar en UTC en lugar de en las zonas horarias locales.

#!/bin/bash
buildNumber=$(date -u "+%Y%m%d%H%M")
/usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $buildNumber" "$INFOPLIST_FILE"  # Version number
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"  # Build number
echo "DateTime for app version number: $buildNumber"

O haga un híbrido, con un convencional 1.2.3para el número de versión y una fecha y hora como número de compilación. Para hacer el híbrido, simplemente comente la CFBundleShortVersionStringlínea con un #frente.

Albahaca Bourque
fuente
8

El esquema más sensato para mí es usar el número de versión (es decir, CFBundleShortVersionString) para el número de versión real, y luego usar el número de compilación (es decir CFBundleVersion) para representar el envío a la App Store. Entonces, a menos que haya algún problema y, por lo tanto, se vuelva a enviar, este número es siempre 1. Para una nueva versión, lo restablezco a 1 si la anterior tuvo problemas en las pruebas de TestFlight o en la revisión.

Los números de compilación brindan una forma de nombrar cada uno de los envíos que proporcionas para una versión en particular. Como se describe en las definiciones anteriores, la colección de todas las compilaciones que proporcionas para una versión particular de tu aplicación se denomina "tren de lanzamiento" de esa versión. Para las aplicaciones iOS, los números de compilación deben ser únicos dentro de cada tren de lanzamiento, pero no es necesario que sean únicos en los diferentes trenes de lanzamiento [mi énfasis]. Es decir, para las aplicaciones de iOS, puede usar los mismos números de compilación nuevamente en diferentes trenes de lanzamiento si lo desea.

De la nota técnica TN2420: números de versión y números de compilación .

Plindberg
fuente
1
Es bueno ver una respuesta que proporciona una referencia oficial que confirma las interpretaciones presentadas en otras respuestas en esta página.
user2067021
6

Utilizo CFBundleVersion para indicar la compilación interna de CFBundleShortVersionString . Utilizo el vuelo de prueba para enviar compilaciones para mis probadores, por lo que la diferencia entre ellas ha sido extremadamente útil.

Los documentos de Apple dicen que CFBundleVersion "debería ser una cadena compuesta por 3 enteros separados por puntos no negativos", pero en realidad puede ser MÁS DE puntos 3 partes (como muestra la respuesta anterior). Lo uso para indicar mi compilación de desarrollo, digamos que mi CFBundleShortVersionString es 1.0.0, puedo usar 1.0.0.11 para CFBundleVersion para indicar que es mi undécima compilación para la versión 1.0.0

Cada CFBundleVersion enviada a la tienda de aplicaciones debe ser más grande que antes o obtendrá el ERROR ITMS-90478 : "Versión no válida . La compilación con la versión“ xxx ”no se puede importar porque se ha cerrado una versión posterior para envíos de nuevas compilaciones. Elija un número de versión diferente ".

CFBundleShortVersionString solo puede tener 3 partes o obtendrá ERROR ITMS-90060: El valor de la clave CFBundleShortVersionString 'xxx' en el archivo Info.plist debe ser una lista separada por puntos de como máximo tres enteros no negativos ".

El tercer número que mencionó Basil Bourque, es decir, el número de versión que se muestra en iTunesConnect es donde las cosas pueden complicarse.

Utilizo un número de iTunesConnect diferente al de CFBundleShortVersionString porque cuando envié mi aplicación por primera vez a la tienda de aplicaciones ya tenemos muchas rondas de lanzamientos internos. Así que usé 1.0 para el número de iTunesConnect y 5.x para CFBundleShortVersionString. En la próxima versión de la tienda de aplicaciones, proporcioné una función para verificar si hay una versión más nueva en la tienda de aplicaciones y me di cuenta de que ahora tenía problemas porque solo puedo obtener el número de iTunesConnect (usando http://itunes.apple.com/lookup?bundleId=), por lo que necesito hacer algunos cálculos antes de compararlo. con el número CFBundleShortVersionString.

Traté de arreglar eso usando el número de iTunesConnect como mi CFBundleShortVersionString, pero recibí el error ERROR ITMS-90062 : "Este paquete no es válido. El valor de la clave CFBundleShortVersionString [xxx] en el archivo Info.plist debe contener una versión superior a esa de la versión aprobada previamente [xxx] ".

Así que te sugeriré que siempre los hagas iguales.

Qiulang
fuente
5

Algo que nunca he visto discutido en ninguna parte es ¿cuál es el número máximo para cada campo en una CFBundleVersion?

Al establecer CFBundleVersion en una aplicación en 1.1.1 y observar el valor hexadecimal de la versión en "lsregister -dump", determiné que el valor máximo para el primer campo es (2 ^ 22) -1 o 4194303, y el máximo los valores para el segundo y tercer campo son (2 ^ 21) -1 o 2097151.

Los 3 campos suman 64 bits.

Esto tiene implicaciones para aquellos de nosotros que usamos CFBundleVersion según la fecha y la hora.

Estaba configurando el primer campo en YYYYMMDD. Esto siempre es mayor que el número máximo de versiones permitidas y conducía a resultados impredecibles, por decir lo menos, cuando Launch Services estaba decidiendo qué versión de una aplicación ejecutar cuando tenía varias versiones instaladas y estaba usando algo como 'open -a Appname 'desde la línea de comando.

Por favor difunda esto ampliamente. Estoy seguro de que mucha gente se está despejando de esto.

Dave Evans
fuente
¿Recuerdas qué se hace si se agrega un cuarto campo (1.1.1.20191201) y qué terminas usando en su lugar? Realmente desearía que Apple usara el mismo valor numérico que Android hizo aquí. PD ¡Gracias por buscar esto!
Spacesuitdiver
Creo que la restricción está documentada aquí y es un poco más restrictiva de lo que se menciona aquí.
saagarjha
3

A partir de ahora, la documentación de Apple para losCFBundleVersion estados [énfasis mío]:

La versión de compilación que identifica una iteración del paquete.

...

Esta clave es una cadena legible por máquina compuesta de uno a tres números enteros separados por puntos, como 10.14.1. La cadena solo puede contener caracteres numéricos (0-9) y puntos.

...

Puede incluir más números enteros pero el sistema los ignora.

Para CFBundleShortVersionString[énfasis mío]:

El lanzamiento o el número de versión del paquete.

...

Esta clave es una cadena visible para el usuario para la versión del paquete. El formato requerido son tres enteros separados por puntos, como 10.14.1. La cadena solo puede contener caracteres numéricos (0-9) y puntos.

Sugeriría CFBundleVersionaumentar automáticamente para cada compilación (o cada lanzamiento de TestFlight) y restablecerlo a 0 cada vez que cambie CFBundleShortVersionString.

Debe planificar explícitamente, o idear un medio coherente, para actualizar la versión visible del usuario en CFBundleShortVersionString.

Kenny Evitt
fuente