144 votes

Comment afficher de manière programmatique le numéro de version/build de la cible dans une application iOS ?

Comment puis-je obtenir de manière programmatique la valeur de l'élément target version comme dans l'image ci-dessous ?

Comme on le voit dans la fenêtre des propriétés de la cible de mon projet Xcode. Je veux afficher cela dans l'écran d'accueil de mon application pour savoir quelle version les gens utilisent actuellement ?

413voto

Viktor Lexington Points 3068

Il y a 2 Des chiffres !

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é sur les sorties et les nouvelles fonctionnalités. Il ne doit pas s'arrêter à 9, 1.11.23 est un numéro de version raisonnable.

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 branche du dépôt ou son numéro de commit. Ce numéro devrait être unique pour distinguer les différents builds, qui n'ont que des changements incrémentaux mineurs.


Pour obtenir le version numéro :

Objective-C :

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

Swift < 3.0 :

let appVersionString: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String

Swift 3.0+ (testé avec 5.0) :

let appVersionString: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String

Pour obtenir le construire numéro :

Objective-C :

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

Swift < 3.0 :

let buildNumber: String = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String

Swift 3.0+ (testé jusqu'à 5.0) :

let buildNumber: String = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String   

Si vous voulez les deux en un :

Utilisez d'abord les lignes ci-dessus, puis la suivante.

Objective-C :

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

Swift (testé jusqu'à 5.0) :

let versionAndBuildNumber: String = "\(appVersionString) (\(buildNumber))"

Notes :

Les valeurs dans le paquet principal ne sont pas toujours présentes, par exemple dans une application en ligne de commande il n'y a pas de CFBundleShortVersionString ou CFBundleVersion donc les méthodes retourneront nil et il se plantera parce que dans le code il fait un downcast incorrect. Mais dans les applications Cocoa iOS et Mac normales, ces valeurs sont définies et ne seront pas supprimées.

Ceci est testé avec Xcode Version 7.3 (7D175) . 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"

Pour Xcode faites ce qui suit :

Étape 1

step1

Étape 2

step2

Étape 3

step3

4 votes

Juste pour ajouter pour l'exemple ci-dessus, "CFBundleVersion" est le Build=300, "CFBundleShortVersionString" est la Version=0.41. La réponse de Viktor devrait être la bonne.

1 votes

J'ai eu des problèmes avec les nombres hexadécimaux une fois. Apple indique qu'il faut utiliser des nombres entiers : developer.apple.com/library/ios/documentation/general/Reference/

0 votes

Savez-vous s'il existe des constantes de chaîne pour @"CFBundleShortVersionString" et @"CFBundleVersion" ?

13voto

Esq Points 498

Vous n'avez pas besoin de changer quoi que ce soit dans votre projet ou dans Xcode. Voici la version Swift pour les deux séparément :

let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String

Il est inclus dans ce repo, regardez-le :

https://github.com/goktugyil/EZSwiftExtensions

5voto

tanaschita Points 181

Voici le même code pour Swift 3 :

let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") as! String

4voto

Sandy Points 412

Afficher de manière programmée la version et le numéro de build - Swift 4.0

let versionNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "1.0"

let buildNumber = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "1.0"            

let versionAndBuildNumber = "Ver #\(versionNumber) ( Build #\(buildNumber) )"

3voto

J'ai créé une extension pour Bundle afin qu'il soit facile à utiliser.

extension Bundle {
    var releaseVersionNumber: String? {
        return infoDictionary?["CFBundleShortVersionString"] as? String
    }

    var buildVersionNumber: String? {
        return infoDictionary?["CFBundleVersion"] as? String
    }

    var applicationName: String {
        return infoDictionary?["CFBundleDisplayName"] as? String ?? "ADKATech"
    }

    var applicationReleaseDate: String {
        return infoDictionary?["ApplicationReleaseDate"] as? String ?? Date().description
    }

    var applicationReleaseNumber: Int {
        return infoDictionary?["ApplicationReleaseNumber"] as? Int ?? 0
    }

    var releaseVersionNumberPretty: String {
        return "\(releaseVersionNumber ?? "1.0.0")"
    }

    var buildVersionNumberPretty: String {
        return "\(buildVersionNumber ?? "1")"
    }
}

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