Quelle version / numéro de build de l'application iOS DOIT être incrémentée lors de la sortie de l'App Store?

107

Les champs de version / build pour une application iOS incluent:

  • "Version" CFBundleShortVersionString (String - iOS, OS X) spécifie le numéro de version de l'édition du bundle, qui identifie une itération publiée de l'application. Le numéro de version de la version est une chaîne composée de trois entiers séparés par des points.

  • "Build" CFBundleVersion (String - iOS, OS X) spécifie le numéro de version de build du bundle, qui identifie une itération (publiée ou non) du bundle. Le numéro de version de build doit être une chaîne composée de trois entiers non négatifs séparés par des points, le premier entier étant supérieur à zéro. La chaîne ne doit contenir que des caractères numériques (0-9) et point (.). Les zéros non significatifs sont tronqués à partir de chaque entier et seront ignorés (c'est-à-dire que 1.02.3 équivaut à 1.2.3). Cette clé n'est pas localisable.

  • «Numéro de version d'iTunes Connect» : numéro de version que vous spécifiez lors de la création d'une nouvelle version de l'application sur iTunes Connect.

Ma question est:

Quels numéros de version / build doivent être incrémentés lorsqu'une nouvelle version de l'application est téléchargée sur iTunes Connect et / ou publiée sur l'App Store?

La "version" CFBundleShortVersionStringou la "construction" peuvent-elles CFBundleVersionrester les mêmes entre les mises à jour de l'application?

Points supplémentaires pour les sources Apple ou les messages d'erreur exacts qu'iTunesConnect affiche lors du téléchargement d'une version / numéro de build invalide.


Remarque Android / Google Play:

La discussion suscitant cette question est que la "version" publique d'une application Android dans le Google Play Store n'a pas besoin d'être incrémentée et n'est en aucun cas validée. Le android:versionNamepeut rester le même entre les versions, la mise à niveau, la rétrogradation ou être une chaîne aléatoire plutôt que quelque chose qui semble être un "numéro de version" valide.

android:versionName - Une valeur de chaîne qui représente la version finale du code d'application, telle qu'elle doit être présentée aux utilisateurs.

La valeur est une chaîne afin que vous puissiez décrire la version de l'application sous la forme d'une <major>.<minor>.<point>chaîne ou de tout autre type d'identificateur de version absolu ou relatif.

Différence entre versionName et versionNumber sous Android

Alors que le android:versionCodeest forcé d'être un entier incrémenté à la libération.


Documentation Apple

Comme indiqué dans la nouvelle réponse acceptée , Apple a récemment publié une note technique qui détaille leur version et le schéma de numéro de build:

Note technique Apple TN2420 - Numéros de version et numéros de build

pkamb
la source
Une réponse détaillée avec capture d'écran: stackoverflow.com/a/31921249/936957
Yunus Nedim Mehel

Réponses:

115

Note technique Apple TN2420, numéros de version et numéros de build

Résumé:

  • La paire ( Version, Build number) doit être unique.
    • La séquence est valide: (1.0.1, 12) -> (1.0.1, 13) -> (1.0.2, 13) -> (1.0.2, 14) ...
  • Version( CFBundleShortVersionString ) doit être dans l'ordre séquentiel ascendant.
  • Build number( CFBundleVersion ) doit être dans l'ordre séquentiel croissant.

Liste de contrôle du numéro de version et du numéro de build

Voici quelques éléments que vous pouvez vérifier lors de la soumission d'une nouvelle version sur l'App Store. S'assurer que votre numéro de version et votre numéro de build sont correctement définis vous aidera en évitant que votre application soit automatiquement rejetée pour avoir été mal configurée.

  1. Pour chaque nouvelle version de votre application, vous devez inventer un nouveau numéro de version. Ce nombre doit être une valeur supérieure au dernier numéro de version que vous avez utilisé. Bien que vous puissiez fournir de nombreuses versions pour une version particulière de votre application, vous ne devez utiliser qu'un nouveau numéro de version pour chaque nouvelle version de votre application.
  2. Vous ne pouvez pas réutiliser les numéros de version.
  3. Pour chaque nouvelle build que vous soumettez, vous devrez inventer un nouveau numéro de build dont la valeur est supérieure au dernier numéro de build que vous avez utilisé (pour cette même version).
  4. Vous pouvez réutiliser les numéros de build dans différents trains de versions, mais vous ne pouvez pas réutiliser les numéros de build dans le même train de versions. Pour les applications macOS, vous ne pouvez pas réutiliser les numéros de build dans un train de versions.

Sur la base de la liste de contrôle, la (Version, Build Number)séquence suivante est également valide.

  • Cas: réutilisation Build Numberdans différents trains de versions. (REMARQUE: PAS d' application macOS)

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

AechoLiu
la source
Je suis confus. L'une des conditions est «Vous ne pouvez pas réutiliser les numéros de version», mais dans le dernier exemple, les numéros de version restent les mêmes tandis que les numéros de build augmentent. Est-ce que j'interprète mal quelque chose?
Emil
@Emil, je pense que sa paire (Version, Build Number) ne peut pas être réutilisée.
AechoLiu
6
Les numéros de version @EmilParikh peuvent être téléchargés sur Apple plusieurs fois avant la sortie , chacun avec un numéro de build unique. Mais une fois qu'il a été publié, vous ne pouvez pas réutiliser ce numéro de version.
pkamb
1
TN2420 indique que "les numéros de version et les numéros de build peuvent avoir jusqu'à trois composants séparés par des points" et fournit ensuite l' exemple illégal suivant 1.10000.1.5 . Cependant, il semble que de nombreuses applications, y compris Chrome, utilisent un numéro de version qui contient 4 composants (par exemple 68.0.3440.83 ). Je suppose que cela pourrait s'expliquer par le fait que la page TN2420 mentionne " Important: Ce document n'est plus mis à jour. " Cependant, je n'ai pas pu trouver un document mis à jour définissant les nouvelles règles. Quelqu'un d'autre est confus?
catanman
@catanman J'aime cette version sémantique . Que la version soit composée avec (major, minor, patch)manière. Et j'avais déjà utilisé 4 composants, mais l'App Store n'accepte pas ce format avec 4 composants.
AechoLiu
38

Le CFBundleShortVersionStringdoit correspondre au numéro de version que vous donnez à iTunes Connect. C'est également le numéro de version qui apparaît lorsque l'utilisateur regarde votre application dans l'App Store.

Le numéro de version est affiché dans le magasin et cette version doit correspondre au numéro de version que vous entrez plus tard dans iTunes Connect.

La source

Le CFBundleVersionn'est pas affiché dans l'App Store, mais est utilisé par iTunes pour déterminer quand votre application a été mise à jour.

Si vous mettez à jour la chaîne de construction, comme décrit dans «Définition du numéro de version et de la chaîne de construction», iTunes reconnaît que la chaîne de construction a changé et synchronise correctement le nouveau package iOS App Store avec les appareils de test.

La source

Répondre plus spécifiquement à vos questions ...

Quels numéros de version / build doivent être incrémentés lorsqu'une nouvelle version de l'application est téléchargée sur l'App Store?

Tous les deux. L'un est affiché dans l'App Store, l'autre est utilisé par iTunes pour mettre à jour l'application.

CFBundleShortVersionString ou CFBundleVersion peuvent-ils rester les mêmes entre les mises à jour d'applications?

Non (question méta, quel serait le cas d'utilisation ici? Si vous avez modifié la charge utile de quelque manière que ce soit, la construction sera différente et l'utilisateur voudra en savoir plus). Si vous essayez, vous verrez des messages d'erreur comme ci-dessous:

Messages d'erreur

Ou sont-ils comparés au numéro respectif précédent pour garantir qu'un nombre numériquement plus grand est téléchargé avec la nouvelle version de l'application?

Oui. Utilisation du standard semver.org .

Les numéros CFBundleShortVersionString et CFBundleVersion sont-ils en quelque sorte comparés les uns aux autres?

Non.

Andy
la source
2
Oui, je sais comment les deux nombres sont utilisés. La question est: les deux doivent-ils être incrémentés lors de la publication d'une nouvelle version de l'application?
pkamb le
2
Oui, si vous essayez de pousser une application dans l'App Store sans mettre à jour les deux, vous verrez un message d'erreur, par exemple stackoverflow.com/questions/19367893/…
Andy
Merci, bonne modification. Surtout pour ce lien. Le validateur de l'organisateur affiche des erreurs "doit contenir une version supérieure" pour CFBundleVersion et CFBundleShortVersionString.
pkamb
1
+1 pour le lien SemVer ... Étant donné un numéro de version MAJOR.MINOR.PATCH, incrémentez la version: MAJOR lorsque vous effectuez des modifications d'API incompatibles, la version MINOR lorsque vous ajoutez des fonctionnalités de manière rétrocompatible et la version PATCH lorsque vous effectuez des modifications en arrière -corrections de bogues compatibles.
jeet.chanchawat
À ce propos: quel serait le cas d'utilisation ici? Si vous avez modifié la charge utile de quelque manière que ce soit, la construction sera différente et l'utilisateur voudra en savoir plus . Mon cas d'utilisation est que mon application a été examinée avec succès par Apple, mais jamais publiée auparavant dans l'App Store. J'ai trouvé une erreur et je veux la corriger - sans changer CFBundleShortVersionString. Est-ce possible? Je souhaite rejeter ma propre application.
test
31

CFBundleShortVersionString est le "nom" public de la version (exemple: "2.5" ou "3.8.1"). Vous devez l'augmenter à chaque version .

CFBundleVersion est le numéro de build privé . Il n'est pas visible sur l'AppStore. Vous devez l'augmenter à chaque téléchargement . Cela signifie que si jamais vous rejetez un binaire avant qu'il ne soit mis en ligne, et que vous souhaitez télécharger un nouveau binaire, il aura le même CFBundleShortVersionString mais doit avoir une CFBundleVersion plus élevée (exemple: public "2.5", privé "2.5", puis rejet binaire et re-téléversement privé "2.5.1")

Edit le 16 novembre 2016:

/ ! \ La propriété CFBundleVersion est également utilisée (avec CFBundleName ) dans l'en- User-Agenttête envoyé par NSURLConnection dans votre code.

Exemple: si CFBundleName est MyApp et CFBundleVersion est 2.21, alors toute requête HTTP programmatique envoyée directement par votre code à l'aide de NSURLConnection incorporera l'en-tête:

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

(Cela ne s'applique pas aux demandes émises automatiquement par UIWebView).

Gabriel
la source
2
Grande distinction entre les exigences de téléchargement / de publication.
pkamb
@gabriel, j'ai essayé de définir le numéro de build sur XX-rc2 mais le validateur de l'Organisateur ne me permet pas de définir quoi que ce soit de différent de XYZ où X, Y et Z sont des nombres entiers: S. Ce serait formidable d'avoir un numéro de build -rc2, avez-vous déjà pu soumettre une version avec?
Néstor
1
@nestor Vous avez raison, j'avais tort. Seuls les nombres sont autorisés. Permettez-moi de modifier ma réponse.
Gabriel
@gabriel, j'utiliser un script pour analyser X.X-rc2à X.X.2, pour le système CI pour générer le buildNumberpour le téléchargement à iTunesConnect.
AechoLiu
5

CFBundleVersion et CFBundleShortVersionString doivent être supérieurs au dernier numéro de version de l'application. C'est une bonne pratique de les garder identiques. Vous devriez les trouver dans votre -info.plist.

Lorsque vous essayez de valider l'application dans l'organiseur, une erreur est générée si l'un d'eux n'a pas été incrémenté. Cela m'est arrivé hier soir.

xoail
la source
J'ai mentionné ces deux éléments dans ma question. Répondez-vous ici que ces deux valeurs doivent être incrémentées? Pouvez-vous mieux soutenir votre réponse?
pkamb
Oui, les deux doivent être incrémentés. Hier soir, quand j'ai essayé de soumettre avant de les incrémenter, il s'est plaint pour les deux clés.
xoail
Merci pour l'information supplémentaire. Vous devez modifier votre réponse pour ajouter votre expérience lors du téléchargement d'une compilation.
pkamb
6
«C'est une bonne pratique de les garder identiques» - ce n'est pas forcément vrai. Si des testeurs travaillent sur votre application, vous souhaiterez peut-être incrémenter votre numéro de version à mesure que les modifications sont appliquées, mais gardez le même numéro de version. Grâce à l'intégration continue, vous pouvez lui demander de mettre à jour votre numéro de build pour vous avant de le déployer vers les testeurs, par exemple.
Andy
@Et tu as raison, ça a du sens. Merci d'avoir signalé le cas d'utilisation. Je ne pensais qu'à un seul environnement de développeur / testeur.
xoail
5

Les deux CFBundleVersionet CFBundleShortVersionString DOIT être incrémentés lors de la publication d'une nouvelle version sur l'App Store.

De plus, l'une des chaînes doit correspondre à la version spécifiée dans iTunes Connect.

Erreur Xcode Organizer Validator: doit incrémenter le numéro de version.

Cette question comprend la capture d'écran ci-dessus du validateur de l'organisateur Xcode refusant de valider l'application lorsque CFBundleVersionet CFBundleShortVersionStringn'ont pas été incrémentés.

  • Ce bundle n'est pas valide. La valeur de la clé CFBundleVersion[1.0] dans le fichier Info.plist doit contenir une version supérieure à celle de la version précédemment téléchargée [1.134].

  • Ce bundle n'est pas valide. La valeur de la clé CFBundleShortVersionString[1.0] dans le fichier Info.plist doit contenir une version supérieure à celle de la version précédemment téléchargée [1.134].

Le validateur renvoie également une erreur prouvant que l'une des chaînes doit correspondre à la version de l'application créée sur iTunes Connect.

  • Incompatibilite de version. Ni CFBundleVersion ['1.0'] ni CFBundleShortVersionString ['1.0'] dans Info.plist ne correspondent à la version de l'application définie dans iTunes Connect ['1.4'].
pkamb
la source
2

La note technique actuelle d' Apple TN2420, les numéros de version et les numéros de construction dit (en gras):

  1. Pour les applications iOS, vous pouvez réutiliser les numéros de build dans différents trains de versions, mais vous ne pouvez pas réutiliser les numéros de build dans le même train de versions. Pour les applications macOS, vous ne pouvez pas réutiliser les numéros de build dans un train de versions .

Malheureusement, cela signifie que vous ne pouvez pas réutiliser un numéro de version qui suit le numéro de train de version sur iOS lorsque vous essayez de publier la même version sur Mac Catalyst.

Dans mon cas, par exemple, en raison de problèmes antérieurs, j'ai fini par publier 1.0.2 (4) en tant qu'application Mac Catalyst qui correspondait à 1.0.2 (1) sur iOS. Désormais, lorsque vous essayez de publier 1.0.3 (1) sur les deux, l'application échoue à la vérification sur MacOS en raison du numéro de version, alors qu'elle réussit la vérification sur iOS.

Je suppose que maintenant que je publie la même application sur iOS et MacOS régulièrement, j'adopterai des numéros de build qui correspondent à la date, comme 20200111 et incrémenter avec un point décimal si je dois changer le numéro de build dans une version donnée.

Steve Harris
la source
1

Vous devez incrémenter les deux .

Lors du téléchargement d'une nouvelle version, vous devrez créer une nouvelle version sur iTunes Connect, qui sera automatiquement supérieure aux versions précédentes. Cette version sur iTunes Connect attendra un binaire avec le même numéro de version, il CFBundleShortVersionStringdoit donc être incrémenté.

Si vous mettez à jour la version mais oubliez d'incrémenter le CFBundleVersion , vous rencontrerez une erreur lors du téléchargement. Voir la réponse et la capture d'écran de pkamb.

Pour plus de détails sur CFBundleShortVersionStringet CFBundleVersion, veuillez consulter: https://stackoverflow.com/a/31921249/936957

Yunus Nedim Mehel
la source
1

Je peux confirmer, après l'avoir essayé dans les deux sens, qu'une séquence de numéros de version et de build comme ...

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

... sera accepté pour les applications iOS, mais pour les applications Mac (Catalyst), il renvoie cette erreur:

ERREUR ITMS-90061: "Ce bundle n'est pas valide. La valeur de la clé CFBundleVersion [1] dans le fichier Info.plist doit contenir une version supérieure à celle de la version précédemment téléchargée [2]."

La version Mac et les numéros de build devraient ressembler à ...

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

Pour iOS, j'avais l'habitude de saisir les numéros de version comme numéro de version plus un quatrième chiffre, comme ...

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

... mais ce n'est pas non plus autorisé pour les applications Mac. Lorsque j'ai essayé de soumettre ma première application Mac (Catalyst), Apple n'acceptait qu'un numéro de build avec trois chiffres ou moins:

ERREUR ITMS-9000: "Cet ensemble n'est pas valide. La valeur de la clé CFBundleVersion [1.0.0.1] dans le fichier Info.plist doit être une liste séparée par des points d'au plus trois entiers non négatifs."

Je suis donc passé à un numéro unique qui s'incrémente pour chaque build et continue d'augmenter à travers les numéros de version.

arlomedia
la source
Avez-vous l'un des messages d'erreur qu'il vous a transmis? Veuillez les citer si oui!
pkamb
0

Je me prépare à publier une nouvelle application Mac App Store. Utilisation du formatage CalVer de YEAR.release (build).

Je plusieurs builds téléchargé: 2020.0 (1), 2020.0 (2), etc. J'ai finalement soumis2020.0 (8) pour examen App Store. Cela a passé l'examen et est dans l'état En attente de publication du développeur .

Je voulais corriger quelques problèmes avant la publication, j'ai donc ajouté une nouvelle version au même train de versions: 2020.0 (9) .

Cela entraîne l'erreur:

Erreur de fonctionnement de l'App Store Connect

ERREUR ITMS-90062 : « Ce paquet est invalide La valeur de la clé. CFBundleShortVersionString[2020.0] dans le fichier Info.plist doit contenir une version supérieure à celle de la version précédente approuvée [2020,0] S'il vous plaît trouver plus d' informations sur. CFBundleShortVersionStringÀ https: // developer.apple.com/documentation/bundleresources/information_property_list/cfbundleshortversionstring "

ce qui est ennuyeux car ma 2020.0version n'a jamais été publiée . D'après la réponse acceptée à cette question, j'avais l'impression que jusqu'à ce que l'application soit disponible sur l'App Store, vous pouviez continuer à publier de nouvelles versions avec la même version.

La solution semble être qu'un «train de versions» (même version + nouvelle version) ne peut pas être mis à jour si l'état de l'application est en attente de publication du développeur . Soit publiez votre version existante, puis augmentez la version, soit annulez cette version dans App Store Connect pour autoriser d'autres téléchargements pour ce train de versions.

pkamb
la source
-2

AFAIK, du haut de ma tête, il vous suffit d'incrémenter le numéro de build CFBundleVersion . L'incrémentation de la chaîne de version courte n'est pas nécessairement nécessaire, bien que vous devriez probablement l'incrémenter, car cela indique à l'utilisateur que l'application est nouvelle. Cependant, Apple dit que la numérotation doit suivre les conventions de version logicielles traditionnelles et iTunes Connect peut se plaindre si vous essayez de télécharger à nouveau une version déjà existante.

Pour faire court, cela peut fonctionner, mais probablement pas.

SevenBits
la source
Vous cherchez des réponses faisant autorité sur les clés doivent être incrémentée. S'il CFBundleShortVersionStringn'est pas nécessaire d'incrémenter, la «même» version destinée à l'utilisateur peut alors être téléchargée plusieurs fois sur l'App Store?
pkamb