Que número (s) de versão / compilação do aplicativo iOS DEVEM ser incrementados após o lançamento da App Store?

107

Os campos de versão / compilação para um aplicativo iOS incluem:

  • "Versão" 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.

  • "Build" CFBundleVersion (String - iOS, OS X) especifica o número da versão do build 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.

  • "Número da versão do iTunes Connect" : número da versão que você especifica ao criar uma nova versão do aplicativo no iTunes Connect.

Minha pergunta é:

Quais números de versão / compilação precisam ser incrementados quando uma nova versão do aplicativo é carregada no iTunes Connect e / ou lançada na App Store?

A "versão" CFBundleShortVersionStringou a "construção" podem CFBundleVersionpermanecer iguais entre as atualizações do aplicativo?

Pontos extras para fontes da Apple ou as mensagens de erro exatas que o iTunesConnect exibe ao enviar um número de versão / compilação inválido.


Nota Android / Google Play:

A discussão que levanta esta questão é que a "versão" pública de um aplicativo Android na Google Play Store não precisa ser incrementada e não é de forma alguma validada. O android:versionNamepode permanecer o mesmo entre lançamentos, upgrade, downgrade ou ser qualquer sequência aleatória em vez de algo que pareça ser um "número de versão" válido.

android:versionName - Um valor de string que representa a versão de lançamento do código do aplicativo, como deve ser mostrado aos usuários.

O valor é uma string para que você possa descrever a versão do aplicativo como uma <major>.<minor>.<point>string ou como qualquer outro tipo de identificador de versão absoluta ou relativa.

Diferença entre versionName e versionNumber no Android

Considerando que o android:versionCodeé forçado a ser um número inteiro incrementado na liberação.


Documentação da Apple

Conforme observado na resposta recentemente aceita , a Apple publicou recentemente uma Nota Técnica que detalha sua versão e esquema de número de compilação:

Nota técnica da Apple TN2420 - Números de versão e números de compilação

pkamb
fonte
Uma resposta detalhada com captura de tela: stackoverflow.com/a/31921249/936957
Yunus Nedim Mehel

Respostas:

115

Nota técnica da Apple TN2420, números de versão e números de compilação

Resumo:

  • O par ( Version, Build number) deve ser exclusivo.
    • A sequência é válida: (1.0.1, 12) -> (1.0.1, 13) -> (1.0.2, 13) -> (1.0.2, 14) ...
  • Version( CFBundleShortVersionString ) deve estar em ordem sequencial crescente.
  • Build number( CFBundleVersion ) deve estar em ordem sequencial ascendente.

Lista de verificação do número da versão e número da compilação

Aqui estão algumas coisas que você pode verificar ao enviar uma nova construção para a App Store. Certificar-se de que o número da versão e o número da compilação estão definidos corretamente o ajudará a evitar que seu aplicativo seja rejeitado automaticamente por tê-los configurado incorretamente.

  1. Para cada nova versão do seu aplicativo, você precisa inventar um novo número de versão. Este número deve ser um valor maior do que o último número da versão que você usou. Embora você possa fornecer muitas compilações para qualquer versão específica de seu aplicativo, você só precisa usar um novo número de versão para cada nova versão de seu aplicativo.
  2. Você não pode reutilizar números de versão.
  3. Para cada novo build que você enviar, você precisará inventar um novo Build Number cujo valor seja maior que o último Build Number que você usou (para aquela mesma versão).
  4. Você pode reutilizar números de versão em trens de lançamento diferentes, mas não pode reutilizar números de versão no mesmo trem de lançamento. Para aplicativos macOS, você não pode reutilizar números de compilação em nenhum trem de lançamento.

Com base na lista de verificação, a seguinte (Version, Build Number)sequência também é válida.

  • Caso: reutilizar Build Numberem diferentes trens de liberação. (NOTA: NÃO app macOS)

    (1.0.0, 1) -> (1.0.0, 2) -> ... -> (1.0.0, 11) -> ( 1.0.1 , 1 ) -> (1.0.1, 2)

AechoLiu
fonte
Estou confuso. Uma das condições é "Você não pode reutilizar os números de versão", mas no último exemplo, os números de versão permanecem os mesmos enquanto os números de construção estão aumentando. Estou interpretando mal alguma coisa?
Emil
@Emil, acho que seu par (versão, número de compilação) não pode ser reutilizado.
AechoLiu
6
Os números da versão @EmilParikh podem ser carregados na Apple várias vezes antes do lançamento , cada um com um número de construção exclusivo. Mas, depois de liberado, você não pode reutilizar esse número de versão.
pkamb
1
TN2420 diz "Números de versão e números de compilação podem ter até três componentes separados por pontos" e fornece o seguinte exemplo ilegal 1.10000.1.5 . No entanto, parece que muitos aplicativos, incluindo o Chrome, usam um número de versão que contém 4 componentes (por exemplo, 68.0.3440.83 ). Acho que isso pode ser explicado pelo fato de que a página da TN2420 menciona " Importante: este documento não está mais sendo atualizado. " No entanto, não consegui encontrar um documento atualizado que defina as novas regras. Alguém mais confuso?
catanman
@catanman Eu gosto dessa versão semântica . Deixe a versão ser composta com (major, minor, patch)maneira. E eu tinha usado 4 componentes antes, mas a App store não aceita esse formato com 4 componentes.
AechoLiu
38

O CFBundleShortVersionStringdeve corresponder ao número da versão que você forneceu ao iTunes Connect. É também o número da versão que aparece quando o usuário olha seu aplicativo na App Store.

O número da versão é mostrado na loja e essa versão deve corresponder ao número da versão que você inserir posteriormente no iTunes Connect.

Fonte

O CFBundleVersionnão é exibido na App Store, mas é usado pelo iTunes para determinar quando o seu aplicativo foi atualizado.

Se você atualizar a string de construção, conforme descrito em “Configurando o número da versão e a string de construção”, o iTunes reconhece que a string de construção mudou e sincroniza corretamente o novo pacote iOS App Store para testar os dispositivos.

Fonte

Respondendo suas perguntas mais especificamente ...

Quais números de versão / compilação devem ser incrementados quando uma nova versão do aplicativo é enviada para a app store?

Ambos. Um é exibido na App Store, o outro é usado pelo iTunes para atualizar o aplicativo.

CFBundleShortVersionString ou CFBundleVersion podem permanecer iguais entre as atualizações do aplicativo?

Não. (Meta pergunta, qual seria o caso de uso aqui? Se você editou a carga útil de alguma forma, a compilação será diferente e o usuário vai querer saber sobre isso). Se você tentar, verá mensagens de erro como abaixo:

Mensagens de erro

Ou eles são comparados ao respectivo número anterior para garantir que um número numericamente maior seja carregado com a nova versão do aplicativo?

Sim. Usando o padrão semver.org .

Os números CFBundleShortVersionString e CFBundleVersion são comparados de alguma forma?

Não.

Andy
fonte
2
Certo, eu sei como os dois números são usados. A questão é: ambos precisam ser incrementados ao lançar uma nova versão do aplicativo?
pkamb
2
Sim, se você tentar colocar um aplicativo na App Store sem atualizar ambos, verá uma mensagem de erro, por exemplo, stackoverflow.com/questions/19367893/…
Andy
Obrigado, ótima edição. Especialmente para aquele link. O validador do organizador está mostrando erros "deve conter uma versão superior" para CFBundleVersion e CFBundleShortVersionString.
pkamb
1
+1 para o link SemVer ... Dado um número de versão MAJOR.MINOR.PATCH, incremente: a versão MAJOR ao fazer alterações de API incompatíveis, a versão MINOR ao adicionar funcionalidade de maneira compatível com versões anteriores e a versão PATCH ao fazer as versões anteriores - correções de bugs compatíveis.
jeet.chanchawat
Em relação a isso: qual seria o caso de uso aqui? Se você editou a carga útil de alguma forma, a construção será diferente e o usuário vai querer saber sobre isso . Meu caso de uso é que meu aplicativo foi analisado com sucesso pela Apple, mas nunca foi lançado antes na App Store. Encontrei um erro e quero corrigi-lo - sem alterar CFBundleShortVersionString. Isso é possível? Eu quero rejeitar meu próprio aplicativo.
teste de
31

CFBundleShortVersionString é o "nome" público da versão (exemplo: "2.5" ou "3.8.1"). Você deve aumentá-lo a cada lançamento .

CFBundleVersion é o número da compilação privada . Não é visto na AppStore. Você deve aumentá-lo a cada upload . Isso significa que se você rejeitar um binário antes de ficar online e quiser fazer upload de um novo binário, ele terá o mesmo CFBundleShortVersionString, mas deve ter um CFBundleVersion superior (exemplo: público "2.5", privado "2.5" e, em seguida, rejeição binária e reenvio privado "2.5.1")

Editar em 16 de novembro de 2016:

/ ! \ A propriedade CFBundleVersion também é usada (junto com CFBundleName ) no User-Agentcabeçalho enviado por NSURLConnection em seu código.

Exemplo: se CFBundleName for MyApp e CFBundleVersion for 2.21, qualquer consulta HTTP programática enviada diretamente por seu código usando NSURLConnection irá incorporar o cabeçalho:

User-Agent: MyApp/2.21 CFNetwork/... Darwin/...

(Isso não se aplica a solicitações emitidas automaticamente por UIWebView).

Gabriel
fonte
2
Grande distinção entre requisitos para upload / lançamento.
pkamb
@gabriel, tentei definir o número da compilação para XX-rc2, mas o validador do Organizer não me permite definir nada diferente de XYZ, onde X, Y e Z são inteiros: S. Seria ótimo ter um número de compilação -rc2, você já conseguiu enviar uma versão com ele?
Néstor
1
@nestor Você está certo, eu estava errado. Somente números são permitidos. Deixe-me editar minha resposta.
Gabriel
@gabriel, eu uso um script para analisar X.X-rc2a X.X.2, para o sistema de CI para gerar o buildNumberpara fazer o upload para iTunesConnect.
AechoLiu
5

CFBundleVersion e CFBundleShortVersionString deve ser maior que o número da última versão do aplicativo. É uma boa prática mantê-los iguais. Você deve encontrá-los em seu -info.plist.

Ao tentar validar o aplicativo no organizador, ocorrerá um erro se algum deles não tiver sido incrementado. Aconteceu comigo ontem à noite.

xoail
fonte
Mencionei essas duas chaves na minha pergunta. Sua resposta aqui é que ambos os valores devem ser incrementados? Você pode apoiar melhor sua resposta?
pkamb
Sim, ambos precisam ser incrementados. Ontem à noite, quando tentei enviar antes de incrementá-los, ele reclamou das duas chaves.
xoail
Obrigado pela informação adicional. Você deve editar sua resposta para adicionar sua experiência ao enviar uma construção.
pkamb
6
"É uma boa prática mantê-los iguais" - isso não é necessariamente verdade. Se você tiver testadores trabalhando em seu aplicativo, talvez queira incrementar seu número de compilação à medida que as alterações são aplicadas, mas mantenha o mesmo número de versão. Usando a integração contínua, você pode fazer com que ele atualize seu número de compilação para você antes de implantar para testadores, por exemplo.
Andy
@Andy você está certo, faz sentido. Obrigado por apontar o caso de uso. Eu estava pensando apenas em termos de um único ambiente de desenvolvedor / testador.
xoail
5

Ambos CFBundleVersione CFBundleShortVersionString DEVEM ser incrementados ao lançar uma nova versão na App Store.

Além disso, uma das strings deve corresponder à versão especificada no iTunes Connect.

Erro do Xcode Organizer Validator: deve incrementar o número da versão.

Esta questão inclui a captura de tela acima do Validador do Organizador do Xcode recusando-se a validar o aplicativo quando CFBundleVersione CFBundleShortVersionStringnão foram incrementados.

  • Este pacote é inválido. O valor da chave CFBundleVersion[1.0] no arquivo Info.plist deve conter uma versão superior à da versão carregada anteriormente [1.134].

  • Este pacote é inválido. O valor da chave CFBundleShortVersionString[1.0] no arquivo Info.plist deve conter uma versão superior à da versão carregada anteriormente [1.134].

O validador também gera um erro provando que uma das strings deve corresponder à versão do aplicativo criado no iTunes Connect.

  • Incompatibilidade de versão. Nem CFBundleVersion ['1.0'] nem CFBundleShortVersionString ['1.0'] no Info.plist correspondem à versão do aplicativo definida no iTunes Connect ['1.4'].
pkamb
fonte
2

A nota técnica atual da Apple TN2420, Números de versão e números de construção diz (meu negrito):

  1. Para aplicativos iOS, você pode reutilizar números de compilação em trens de lançamento diferentes, mas não pode reutilizar números de compilação dentro do mesmo trem de lançamento. Para aplicativos macOS, você não pode reutilizar números de compilação em nenhum trem de lançamento .

Infelizmente, isso significa que você não pode reutilizar um número de compilação que segue o número do trem de lançamento no iOS quando você está tentando lançar a mesma compilação no Mac Catalyst.

No meu caso, por exemplo, devido a alguns problemas anteriores, acabei lançando 1.0.2 (4) como um aplicativo Mac Catalyst que correspondia a 1.0.2 (1) no iOS. Agora, ao tentar lançar 1.0.3 (1) em ambos, o aplicativo falha na verificação no MacOS por causa do número da compilação, enquanto passa na verificação no iOS.

Acho que agora que estou lançando o mesmo aplicativo no iOS e MacOS rotineiramente, vou adotar números de compilação que correspondem à data, como 20200111 e incrementar com um ponto decimal se eu precisar alterar o número de compilação em uma determinada versão.

Steve Harris
fonte
1

Você precisa incrementar ambos .

Ao fazer upload de uma nova versão, você precisará criar uma nova versão no iTunes Connect, que será automaticamente superior às versões anteriores. Esta versão no iTunes Connect espera um binário com o mesmo número de versão, portanto, CFBundleShortVersionStringprecisa ser incrementado.

Se você atualizar a versão, mas se esquecer de incrementar o CFBundleVersion, encontrará um erro durante o upload. Veja a resposta e a captura de tela de pkamb.

Para obter detalhes sobre CFBundleShortVersionStringe CFBundleVersion, consulte: https://stackoverflow.com/a/31921249/936957

Yunus Nedim Mehel
fonte
1

Posso confirmar, depois de tentar das duas maneiras, que uma sequência de números de versão e construção como ...

1.0.0 (1)
1.0.1 (1)
1.0.2 (1)

... será aceito para aplicativos iOS, mas para aplicativos Mac (Catalyst) retorna este erro:

ERROR ITMS-90061: "Este pacote é inválido. O valor da chave CFBundleVersion [1] no arquivo Info.plist deve conter uma versão superior à da versão enviada anteriormente [2]."

A versão do Mac e os números de compilação precisam ser assim ...

1.0.0 (1)
1.0.1 (2)
1.0.2 (3)

Para iOS, eu costumava inserir números de compilação como o número da versão mais um quarto dígito, como ...

1.0.0 (1.0.0.1)
1.0.1 (1.0.1.1)
1.0.2 (1.0.2.1)

... mas isso também não é permitido para aplicativos Mac. Quando tentei enviar meu primeiro aplicativo Mac (Catalyst), a Apple aceitou apenas um número de compilação com três ou menos dígitos:

ERROR ITMS-9000: "Este pacote é inválido. O valor da chave CFBundleVersion [1.0.0.1] no arquivo Info.plist deve ser uma lista separada por período de no máximo três inteiros não negativos."

Portanto, mudei para um único número que aumenta para cada compilação e continua aumentando entre os números de versão.

arlomédia
fonte
Você tem alguma das mensagens de erro que ele forneceu? Se sim, cite-os!
PKamb
0

Estou me preparando para lançar um novo aplicativo Mac App Store. Usando a formatação CalVer de YEAR.release (build).

Fiz upload de vários constrói: 2020.0 (1), 2020.0 (2), etc. I finalmente enviado 2020.0 (8)para a App Store Review. Passou na revisão e está no estado Pending Developer Release .

Eu queria corrigir algumas coisas antes do lançamento, então eu adicionei uma nova compilação ao mesmo trem lançamento: 2020.0 (9).

Isso resulta no erro:

Erro de operação de conexão da App Store

ERROR ITMS-90062 : "Este pacote é inválido. O valor da chave CFBundleShortVersionString[2020.0] no arquivo Info.plist deve conter uma versão superior à da versão aprovada anteriormente [2020.0]. Encontre mais informações CFBundleShortVersionStringem https: // developer.apple.com/documentation/bundleresources/information_property_list/cfbundleshortversionstring "

o que é irritante, pois minha 2020.0versão nunca foi lançada . A partir da resposta aceita a esta pergunta, fiquei com a impressão de que até que o aplicativo estivesse disponível na App Store você poderia continuar a lançar novos builds com a mesma versão.

A solução parece ser que um "trem de lançamento" (Mesma Versão + Nova Compilação) não pode ser atualizado se o estado do aplicativo for Lançamento Pendente do Desenvolvedor . Liberte a compilação existente e aumente a versão ou cancele esta versão no App Store Connect para permitir uploads adicionais para este trem de lançamento.

pkamb
fonte
-2

AFAIK, pensando bem, você só precisa incrementar o número da compilação CFBundleVersion. Incrementar a string de versão curta não é necessariamente necessário, embora você provavelmente deva incrementá-la, pois ela informa ao usuário que o aplicativo é novo. A Apple diz que a numeração deve seguir as convenções tradicionais de versão de software, entretanto, e o iTunes Connect pode reclamar se você tentar reenviar uma versão já existente.

Resumindo, pode funcionar, mas provavelmente não.

SevenBits
fonte
Procurando por respostas confiáveis ​​nas quais as chaves devem ser incrementadas. Se CFBundleShortVersionStringnão for necessário incrementar, a "mesma" versão voltada para o usuário pode ser carregada na App Store várias vezes.
pkamb