685 votes

Version vs build dans Xcode

J'ai une application que j'ai développée avec Xcode 3 et que j'ai récemment commencé à éditer avec Xcode 4. Dans le résumé de la cible, j'ai le formulaire de cible de l'application iOS avec les champs : identifiant, version, build, dispositifs et cible de déploiement. Le champ version est vide et le champ build est 3.4.0 (ce qui correspond à la version de l'application lorsque je l'éditais encore avec Xcode 3).

Mes questions sont les suivantes :

  1. Quelle est la différence entre les champs version et build ?

  2. Pourquoi le champ de la version était-il vide après la mise à jour vers Xcode 4 ?

0 votes

D'une part, je pense que c'est le numéro de build qui apparaît dans la liste des archives de Xcode Organizer. A part cela, je ne sais pas trop à quoi il sert.

1263voto

nekno Points 10556

Apple a en quelque sorte réarrangé/réutilisé les champs.

À l'avenir, si vous regardez dans l'onglet Info de votre cible d'application, vous devez utiliser "Bundle versions string, short" comme version (par exemple, 3.4.0) et "Bundle version" comme build (par exemple, 500 ou 1A500). Si vous ne voyez pas les deux, vous pouvez les ajouter. Ils correspondront aux zones de texte Version et Build de l'onglet Résumé ; ce sont les mêmes valeurs.

Lorsque vous consultez l'onglet Info, si vous cliquez avec le bouton droit de la souris et sélectionnez Afficher les clés/valeurs brutes vous verrez que les noms réels sont CFBundleShortVersionString (Version) et CFBundleVersion (Construire).

La version est généralement utilisée comme vous semblez l'avoir fait avec Xcode 3. Je ne suis pas sûr du niveau auquel vous posez la question de la différence Version/Build, je vais donc vous répondre de manière philosophique.

Il existe toutes sortes de stratagèmes, mais l'un d'entre eux est populaire :

{MajorVersion}.{MinorVersion}.{Revision}

  • Version majeure - Changements majeurs, refontes et fonctionnalités changements
  • Version mineure - Améliorations mineures, ajouts de fonctionnalités
  • Révision - Un numéro de patch pour les corrections de bogues

Ensuite, le terme Build est utilisé séparément pour indiquer le nombre total de builds pour une version ou pour toute la durée de vie du produit.

De nombreux développeurs commencent le numéro de Build à 0, et à chaque fois qu'ils construisent, ils augmentent le numéro d'une unité, en l'augmentant indéfiniment. Dans mes projets, j'ai un script qui augmente automatiquement le numéro de build à chaque fois que je construis. Voir les instructions pour cela ci-dessous.

  • La version 1.0.0 pourrait être la build 542. Il a fallu 542 builds pour arriver à une une version 1.0.0.
  • La version 1.0.1 pourrait être la build 578.
  • La version 1.1.0 pourrait être la version 694.
  • La version 2.0.0 pourrait être la construction 949.

D'autres développeurs, dont Apple, utilisent un numéro de build composé d'une version majeure + une version mineure + un nombre de builds pour la version. Il s'agit des numéros de version réels des logiciels, par opposition aux valeurs utilisées pour le marketing.

Si vous allez à Xcode menu > À propos de Xcode vous verrez les numéros de version et de construction. Si vous cliquez sur le bouton Plus d'informations... vous verrez un tas de versions différentes. Comme le Plus d'informations... a été supprimé dans Xcode 5, cette information est également disponible à partir de la page d'accueil. Logiciels > Développeur de la section Informations sur le système disponible en ouvrant Apple menu > À propos de ce Mac > Rapport du système... .

Par exemple, Xcode 4.2 (4C139). La version marketing 4.2 correspond à la version majeure Build 4, la version mineure Build C et le numéro de Build 139. La prochaine version (probablement la 4.3) sera probablement la version Build 4D, et le numéro Build commencera à 0 et sera incrémenté à partir de là.

Les numéros de version/bâtiment de l'iPhone Simulator sont les mêmes, tout comme les iPhones, les Macs, etc.

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

Mise à jour : Sur demande, voici les étapes pour créer un script qui s'exécute à chaque fois que vous construisez votre application dans Xcode pour lire le numéro de Build, l'incrémenter et le réécrire dans le fichier de l'application. {App}-Info.plist fichier. Il y a des étapes supplémentaires facultatives si vous voulez écrire vos numéros de version/build dans le fichier Settings.bundle/Root*.plist fichier(s).

Voici un extrait de l'article sur le mode d'emploi ici .

Dans Xcode 4.2 - 5.0 :

  1. Chargez votre projet Xcode.

  2. Dans le volet de gauche, cliquez sur votre projet, tout en haut de la hiérarchie. Ceci chargera l'éditeur de paramètres du projet.

  3. Dans la partie gauche du volet central de la fenêtre, cliquez sur votre application sous l'onglet "Applications". TARGETS tête. Vous devrez configurer cette configuration pour chaque cible du projet.

  4. Sélectionnez le Phases de construction onglet.

    • Dans Xcode 4, en bas à droite, cliquez sur le bouton Ajouter la phase de construction et sélectionnez Ajouter Exécuter script .
    • Dans Xcode 5, sélectionnez Rédacteur en chef menu > Ajouter la phase de construction > Ajouter l'exécution du script Phase de construction .
  5. Faites glisser et déposez le nouveau Exécuter script pour le déplacer juste avant la phase Ressources pour le faisceau de copies (lorsque le fichier app-info.plist sera joint à votre application).

  6. Dans la nouvelle Exécuter script phase, mettre Shell : /bin/bash .

  7. Copiez et collez ce qui suit dans la zone script pour les numéros de construction entiers :

    buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
    buildNumber=$(($buildNumber + 1))
    /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

    Comme @Bdebeez l'a fait remarquer, la Outil générique de gestion des versions d'Apple ( agvtool ) est également disponible. Si vous préférez l'utiliser à la place, il faut d'abord modifier quelques éléments :

    • Sélectionnez le Paramètres de construction onglet.
    • En vertu de la Versioning de la section, définissez le Version actuelle du projet au numéro de construction initial que vous voulez utiliser, par exemple, 1 .
    • Retour sur le Phases de construction l'onglet, faites glisser et déposez votre Exécuter script après la phase de Ressources pour le faisceau de copies pour éviter une situation de course lorsqu'on essaie à la fois de construire et de mettre à jour le fichier source qui contient votre numéro de construction.

    Notez qu'avec le agvtool vous pouvez toujours obtenir périodiquement des constructions échouées/annulées sans erreur. Pour cette raison, je ne recommande pas l'utilisation de la méthode agvtool avec ce script.

    Néanmoins, dans votre Exécuter script vous pouvez utiliser le script suivant :

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

    Le site next-version incrémente le numéro de build ( bump est également un alias pour la même chose), et -all mises à jour Info.plist avec le nouveau numéro de construction.

  8. Et si vous avez un bundle Settings où vous montrez la Version et la Build, vous pouvez ajouter ce qui suit à la fin du script pour mettre à jour la version et la build. Note : Changez le PreferenceSpecifiers pour correspondre à vos paramètres. PreferenceSpecifiers:2 signifie qu'il faut regarder l'élément à l'indice 2 sous la rubrique PreferenceSpecifiers dans votre fichier plist, donc pour un index basé sur 0, c'est le troisième paramètre de préférence dans le tableau.

    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 vous utilisez agvtool au lieu de lire le Info.plist directement, vous pouvez ajouter ce qui suit à votre script à la place :

    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. Et si vous avez une application universelle pour l'iPad et l'iPhone, vous pouvez également définir les paramètres pour le fichier 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

18 votes

"Dans mes projets, j'ai un script qui augmente automatiquement le numéro de build à chaque fois que je construis" - pouvez-vous nous dire comment vous faites cela ? merci pour les réponses détaillées et pour la question originale.

2 votes

@Andrews - J'ai mis à jour ma réponse avec les détails sur la construction script.

9 votes

Pour incrémenter les nombres en hexadécimal, vous pouvez utiliser buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE") dec=$((0x$buildNumber)) buildNumber=$(($dec + 1)) hex=$(printf "%X" $buildNumber) /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $hex" "$INFOPLIST_FILE"

73voto

Yar Points 25421

(Je laisse cela ici pour ma propre référence.) Cela montrera la version et la construction pour les champs "version" et "construction" que vous voyez dans une cible 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)"
}

2 votes

OT : Vous avez une fuite dans votre méthode - vous alloc / init la corde, ce qui retient la corde, mais vous ne la relâchez pas. Sur un objet que vous retournez à partir d'une méthode, vous devriez généralement utiliser une méthode de commodité afin que la chaîne de caractères soit automatiquement libérée, ou appeler la méthode autorelease . Soit : return [NSString stringWithFormat:@"%@ build %@", version, build]; OU return [[[NSString alloc] initWithFormat:@"%@ build %@", version, build] autorelease];

1 votes

Merci @nekno, j'ai changé la réponse pour qu'elle soit adaptée à l'ARC ou au non-ARC.

2 votes

Il est probablement préférable d'utiliser les constantes lorsqu'elles sont disponibles (par exemple, kCFBundleVersionKey), pour éviter les fautes de frappe. Cependant, je n'ai pas pu en trouver une pour "CFBundleShortVersionString" :)

54voto

Bdebeez Points 2066

Le numéro de build est un numéro interne qui indique l'état actuel de l'application. Il diffère du numéro de version en ce sens qu'il n'est généralement pas destiné à l'utilisateur et qu'il n'indique pas de différences, de fonctionnalités ou de mises à niveau comme le ferait un numéro de version.

Pensez-y comme ça :

  • Construire ( CFBundleVersion ) : Le numéro de la construction. En général, on commence à 1 et on augmente de 1 à chaque build de l'application. Cela permet de comparer rapidement quelle build est la plus récente et dénote le sens de la progression du codebase. Ces informations peuvent être extrêmement précieuses lorsque vous travaillez avec le service d'assurance qualité et que vous devez vous assurer que les bogues sont enregistrés dans les bonnes versions.
  • Version marketing ( CFBundleShortVersionString ) : Le numéro de l'utilisateur que vous utilisez pour désigner cette version de votre application. En général, il suit un schéma de version majeure et mineure (par exemple, MyAwesomeApp 1.2) afin que les utilisateurs sachent quelles versions sont des mises à jour de maintenance mineures et quelles sont les nouvelles fonctionnalités importantes.

Pour l'utiliser efficacement dans vos projets, Apple fournit un excellent outil appelé agvtool . Je recommande fortement d'utiliser cette méthode, car elle est BEAUCOUP plus simple que d'écrire un script pour modifier les plists. Il vous permet de définir facilement à la fois le numéro de build et la version marketing. Il est particulièrement utile lors de l'élaboration de scripts (par exemple, pour mettre facilement à jour le numéro de build à chaque build ou même pour demander quel est le numéro de build actuel). Il peut même faire des choses plus exotiques comme marquer votre SVN pour vous lorsque vous mettez à jour le numéro de build.

Pour l'utiliser :

  • Configurez votre projet dans Xcode, sous Versioning, pour utiliser "Apple Generic".
  • En terminal
    • agvtool new-version 1 (mettre le numéro de Build à 1)
    • agvtool new-marketing-version 1.0 (définir la version Marketing à 1.0)

Voir la page de manuel de agvtool pour une tonne de bonnes infos

0 votes

25voto

ale84 Points 501

Le script pour auto-incrémenter le numéro de build dans la réponse ci-dessus n'a pas fonctionné pour moi si le numéro de build est une valeur à virgule flottante, donc je l'ai modifié un peu :

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

22voto

Viktor Lexington Points 3068

Le numéro de communiqué de marketing est pour les clients, appelé numéro de version . Il commence par 1.0 et passe aux mises à jour majeures pour 2.0 , 3.0 pour des mises à jour mineures de 1.1 , 1.2 et pour les corrections de bogues dans 1.0.1 , 1.0.2 . Ce numéro est orienté vers les versions et les nouvelles fonctionnalités.

Le site numéro de fabrication est surtout le nombre interne de constructions qui ont été faites jusqu'alors. Mais certains utilisent d'autres chiffres comme le numéro de la branche du dépôt. Ce numéro devrait être unique pour distinguer les différentes constructions presque identiques.

Comme vous pouvez le voir, le numéro de fabrication n'est pas nécessaire et c'est à vous de choisir quelle est la meilleure solution. numéro de fabrication que vous voulez utiliser. Ainsi, si vous mettez à jour votre Xcode à une version majeure, le construire est vide. Le site version ne doit pas être vide !


Pour obtenir le construire comme un NSString variable :

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

Pour obtenir le version comme un NSString variable :

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

Si vous voulez les deux en une seule fois NSString :

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

Ceci est testé avec Xcode Version 4.6.3 (4H1503) . Le numéro de construction est souvent écrit entre parenthèses / accolades. Le numéro de build est en hexadécimal ou en décimal.

buildandversion


Sur Xcode vous pouvez auto-incrémenter le numéro de fabrication en tant que nombre décimal en plaçant les éléments suivants dans le Run script phase de construction dans les paramètres du projet

#!/bin/bash    
buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
buildNumber=$(($buildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE"

Pour hexadécimal numéro de construction utiliser ce 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"

project_settings

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X