Quais valores devo usar para CFBundleVersion e CFBundleShortVersionString?

98

Este é meu primeiro envio de aplicativo iOS e não quero meu aplicativo rejeitado.

Isto é do Apple Docs:

CFBundleVersion (String - iOS, OS X) especifica o número da versão da compilação do pacote, que identifica uma iteração (lançada ou não) do pacote. O número da versão do build deve ser uma string composta por três inteiros não negativos separados por ponto, sendo o primeiro inteiro maior que zero. A string deve conter apenas caracteres numéricos (0-9) e ponto (.). Os zeros à esquerda são truncados de cada número inteiro e serão ignorados (ou seja, 1.02.3 é equivalente a 1.2.3). Esta chave não é localizável.

CFBundleShortVersionString (String - iOS, OS X) especifica o número da versão de lançamento do pacote, que identifica uma iteração lançada do aplicativo. O número da versão de lançamento é uma string composta por três inteiros separados por pontos. O primeiro inteiro representa as principais revisões do aplicativo, como revisões que implementam novos recursos ou mudanças importantes. O segundo inteiro denota revisões que implementam recursos menos proeminentes. O terceiro inteiro representa versões de manutenção.

O valor desta chave difere do valor de “CFBundleVersion,” que identifica uma iteração (liberada ou não) do aplicativo. Essa chave pode ser localizada incluindo-a em seus arquivos InfoPlist.strings.

Mas parece um pouco estranho. Minha interpretação para isso é colocar os dois valores iguais, ou seja:

CFBundleVersion: 1.0.0
CFBundleShortVersionString: 1.0.0

Alguém pode confirmar 100% que é o que devo colocar?

Bbx
fonte
1
De acordo com isso, CFBundleShortVersionString pode ser localizado. Mas se tiver que ser três inteiros separados por pontos, que localização é possível?
Rick de
@Rick Suponho que isso signifique que você pode convertê-lo para idiomas que na verdade têm numerais diferentes, como o árabe?
shiser
@shiser Só para ser pedante, "algarismos arábicos" são na verdade os algarismos que usamos no mundo ocidental e na maioria dos outros lugares também. Mas eu entendi o que você quis dizer, e há algumas partes do mundo árabe que não usam "algarismos arábicos". en.wikipedia.org/wiki/Arabic_numerals
RenniePet
1
Outra resposta aqui. stackoverflow.com/q/21125159/419348
AechoLiu

Respostas:

77

Pense da seguinte maneira: A "versão resumida" ( CFBundleShortVersionString) é o número da versão pública. A "versão" ( CFBundleVersion) é mais um número de versão interna que pode mudar com muito mais freqüência do que a "versão resumida" pública. Pessoalmente, eu uso o mesmo para ambos, mas muitas pessoas atualizam a "versão" em cada compilação. De qualquer maneira, você normalmente atualiza a "versão curta" ao lançar para a Apple. A frequência com que você atualiza a "versão" depende de você e de suas necessidades.

rmaddy
fonte
14
Esteja ciente de que a versão do pacote (CFBundleVersion) deve exceder numericamente a versão do pacote de seu aplicativo anterior ou ocorrerá um erro ao enviar para a App Store. Consulte stackoverflow.com/questions/4933093/… .
Phil
3
Semelhante ao que Phil disse acima, hoje em dia, se você reenviar uma compilação com falha (não aprovada pela App Store), parece que você precisa aumentar o CFBundleVersion em cada envio agora , então provavelmente esses números irão divergir a menos que você seja sempre perfeito, ou você não se importa em alterar sua versão pública (CFBundleShortVersionString) # após qualquer alteração necessária para um envio bem-sucedido à App Store.
likethesky
106

CFBundleShortVersionString fornece a versão do seu aplicativo. Normalmente é incrementado cada vez que você publica seu aplicativo na App Store. Esta é a versão que está visível na seção "Versão" da página da App Store de seu aplicativo.

CFBundleVersion fornece o número da compilação que é usado para desenvolvimento e teste, especificamente para fins "técnicos". O usuário final raramente está interessado no número do build, mas durante o desenvolvimento você pode precisar saber o que está sendo desenvolvido e corrigido em cada build. Normalmente, isso é incrementado em cada iteração de versão interna. E você pode usar ferramentas de integração contínua como Jenkins para incrementar automaticamente o número de compilação em cada compilação.

Números de versão e compilação

Os dois números não dependem um do outro, mas é uma boa ideia mantê-los paralelos para evitar confusão. Lembre-se de que, depois que seu aplicativo for aprovado na revisão da App Store, você precisará incrementar o número de compilação, como Phil e likeTheSky declararam, independentemente de publicá-lo ou não.

Caso de uso: digamos que você tenha uma construção bem testada, pronta para envio. O número da versão é 1.0.0 e o número da compilação é 1.0.0.32 . Depois de enviar seu aplicativo, você precisa atualizar a versão como 1.0.1 e o número da compilação como 1.0.1.0 .

Yunus Nedim Mehel
fonte
4
Portanto, é seguro ignorar aquele trecho nos documentos (citado na pergunta) sobre CFBundleVersion sendo " três " valores separados por período?
big_m
Eu acho que depende de você. Se você não publicar uma versão com frequência ou se não precisar seguir estritamente as correções de bugs em ciclos de teste frequentes; você também pode usar 3 dígitos para ambos.
Yunus Nedim Mehel
então, CFBundleVersion pode ser 0 para um build de app store? A Apple vai rejeitá-lo?
kraftydevil
3
Sim, você pode usar valores diferentes de 3 números com pontuação. Usei um valor de data e hora, como 201606070620em um aplicativo iOS de remessa.
Basil Bourque
3
@BasilBourque, se você não seguir as diretrizes, poderá ter problemas se usar as compras no aplicativo. Consulte a Nota Técnica 2413
DanSkeel
16

A resposta de rmaddy está correta. Vou adicionar mais dois pensamentos.

Número da terceira versão

Esteja ciente do número da terceira versão, especificado no site iTunesConnect como parte da definição do seu aplicativo. Se esse número for diferente dos dois no Xcode, a Apple avisa. Você pode ignorar o aviso, pois não é um impedimento (não é um "erro").

Data-hora como versão

Além disso, você não precisa usar três números com pontuação. Isso pode fazer sentido para alguns aplicativos, onde tradicionalmente as mudanças no primeiro número indicavam algum tipo de mudança dramática que geralmente afetava a compatibilidade.

Para outros aplicativos, você pode querer usar simplesmente um valor de data e hora no estilo de formato padrão ISO 8601 (AAAAMMDDHHMM). Por exemplo 201606070620,. Essa ordem de ano-mês-data-hora-minuto apresenta um número cada vez maior, sempre com o mesmo comprimento devido ao preenchimento zero, que quando classificado em ordem alfabética também é cronológico.

Usei com sucesso este estilo de números de versão em um aplicativo iOS de remessa funcionando no iOS 7, 8 e 9.

Você pode até automatizar a geração desse valor. Na do seu projeto Target> Build Phases> Run Scriptpainel:

  1. Especifique no Shellcampo:/bin/sh
  2. Cole o seguinte script de 5 linhas visto abaixo.
  3. (opcional) Marque a Show environment variables in build logcaixa de seleção.
  4. Desmarque a Run script only when installingcaixa de seleção.

Cada vez que você faz uma construção, a data-hora atual no fuso horário UTC é capturada. O -usinalizador no script usa UTC em vez do fuso horário padrão atual. Geralmente é melhor para os programadores e administradores de sistemas usarem e pensarem em UTC em vez de fusos horários locais.

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

Ou faça um híbrido, com um convencional 1.2.3para o número da versão e uma data e hora como o número da compilação. Para fazer o híbrido, simplesmente comente a CFBundleShortVersionStringlinha com um #na frente.

Basil Bourque
fonte
8

O esquema mais sensato para mim é usar o número da versão (ou seja, CFBundleShortVersionString) para o número da versão real e, em seguida, usar o número da compilação (ou seja. CFBundleVersion) Para representar o envio à App Store. Portanto, a menos que haja algum problema e, portanto, seja reenviado, esse número é sempre 1. Para uma nova versão, eu redefino para 1 se a anterior teve problemas no teste TestFlight ou na revisão.

Os números de compilação fornecem uma maneira de nomear cada um dos envios que você fornece para um determinado lançamento. Conforme descrito nas definições acima, a coleção de todas as compilações que você fornece para uma versão específica do seu aplicativo é chamada de 'trem de lançamento' dessa versão. Para aplicativos iOS, os números de build devem ser exclusivos em cada trem de lançamento, mas não precisam ser exclusivos em diferentes trens de lançamento [grifo meu]. Ou seja, para aplicativos iOS, você pode usar os mesmos números de compilação novamente em trens de lançamento diferentes, se desejar.

Da nota técnica TN2420: Números de versão e números de construção .

Plindberg
fonte
1
É bom ver uma resposta que fornece uma referência oficial confirmando as interpretações apresentadas em outras respostas desta página.
user2067021
6

Eu uso CFBundleVersion para indicar construção interna para CFBundleShortVersionString . Eu uso o vôo de teste para enviar compilações para meus testadores, então a diferença entre eles tem sido extremamente útil.

Os documentos da Apple dizem que CFBundleVersion "deve ser uma string composta de 3 inteiros não negativos, separados por ponto", mas na verdade pode ter MAIS DE 3 partes (como mostra a resposta acima). Eu uso isso para indicar minha compilação de desenvolvimento, digamos que meu CFBundleShortVersionString seja 1.0.0, posso usar 1.0.0.11 para CFBundleVersion para indicar que é minha 11ª compilação para a versão 1.0.0

Cada CFBundleVersion enviada à app store deve ser maior do que antes ou você receberá ERROR ITMS-90478 : "Versão inválida. A compilação com a versão“ xxx ”não pode ser importada porque uma versão posterior foi fechada para novos envios de compilação. Escolha um número de versão diferente. "

CFBundleShortVersionString só pode ter 3 partes ou você obterá ERROR ITMS-90060: O valor da chave CFBundleShortVersionString 'xxx' no arquivo Info.plist deve ser uma lista separada por período de no máximo três inteiros não negativos. "

O terceiro número que Basil Bourque mencionou, ou seja, o número da versão exibida no iTunesConnect é onde as coisas podem ficar complicadas.

Eu uso um número iTunesConnect diferente de CFBundleShortVersionString porque, quando enviei meu aplicativo pela primeira vez à app store, já tínhamos muitas rodadas de lançamentos internos. Então, usei 1.0 para o número iTunesConnect e 5.x para CFBundleShortVersionString. Na próxima versão da app store, forneci uma função para verificar se há uma versão mais recente na app store e percebi que tive problemas agora porque só consigo obter o número do iTunesConnect (usando http://itunes.apple.com/lookup?bundleId=), então preciso fazer alguns cálculos antes de compará-lo com o número CFBundleShortVersionString.

Tentei consertar isso usando o número iTunesConnect como meu CFBundleShortVersionString, mas recebi o erro, ERROR ITMS-90062 : "Este pacote é inválido. O valor da chave CFBundleShortVersionString [xxx] no arquivo Info.plist deve conter uma versão superior a essa da versão aprovada anteriormente [xxx]. "

Portanto, vou sugerir que sejam sempre iguais.

Qiulang
fonte
5

Algo que eu nunca vi discutido em qualquer lugar é qual é o número máximo para cada campo em um CFBundleVersion?

Definindo CFBundleVersion em um aplicativo para 1.1.1 e observando o valor hexadecimal para a versão em "lsregister -dump", determinei que o valor máximo para o primeiro campo é (2 ^ 22) -1 ou 4194303, e o máximo os valores para o segundo e terceiro campos são (2 ^ 21) -1 ou 2097151.

Os 3 campos somam 64 bits.

Isso tem implicações para aqueles de nós que usam CFBundleVersion com base na data e hora.

Eu estava definindo o primeiro campo como AAAAMMDD. Isso é sempre maior do que o máximo de versões permitidas e estava levando a resultados imprevisíveis, para dizer o mínimo, quando o Launch Services estava decidindo qual versão de um aplicativo executar quando você tinha várias versões instaladas e estava usando algo como 'open -a Appname 'na linha de comando.

Por favor, espalhe isso amplamente. Tenho certeza de que muitas pessoas estão se desentendendo com isso.

Dave Evans
fonte
Você se lembra do que é feito se um quarto campo for adicionado (1.1.1.20191201) e o que você acaba usando no lugar? Eu realmente gostaria que a Apple apenas usasse o mesmo valor numérico que o android usou aqui. PS obrigado por procurar isso!
spacesuitdiver
Acredito que a restrição está documentada aqui e é um pouco mais restritiva do que o que é mencionado aqui.
saagarjha
3

A partir de agora, a documentação da Apple para osCFBundleVersion estados [grifo meu]:

A versão de construção que identifica uma iteração do pacote.

...

Essa chave é uma string legível por máquina composta de um a três números inteiros separados por período , como 10.14.1. A string pode conter apenas caracteres numéricos (0-9) e pontos.

...

Você pode incluir mais inteiros, mas o sistema os ignora.

Para CFBundleShortVersionString[ênfase minha]:

O lançamento ou número da versão do pacote.

...

Esta chave é uma string visível ao usuário para a versão do pacote. O formato necessário são três inteiros separados por ponto , como 10.14.1. A string pode conter apenas caracteres numéricos (0-9) e pontos.

Eu sugiro apenas incrementar automaticamente CFBundleVersionpara cada construção (ou cada versão do TestFlight) e redefinir para 0 sempre que você mudar CFBundleShortVersionString.

Você deve planejar explicitamente, ou criar um meio consistente, para atualizar a versão visível do usuário no CFBundleShortVersionString.

Kenny Evitt
fonte