Lire la version sur Info.plist

91

Je veux lire les informations de version du bundle d'Info.plist dans mon code, de préférence sous forme de chaîne. Comment puis-je faire ceci?

John Smith
la source

Réponses:

201

Vous pouvez lire votre Info.plist sous forme de dictionnaire avec

[[NSBundle mainBundle] infoDictionary]

Et vous pouvez facilement obtenir la version à la CFBundleVersionclé de cette façon.

Enfin, vous pouvez obtenir la version avec

NSDictionary* infoDict = [[NSBundle mainBundle] infoDictionary];
NSString* version = [infoDict objectForKey:@"CFBundleVersion"];
gcamp
la source
Parfait. C'est beaucoup plus simple que toutes les lignes de fonctions CF * que j'utilisais ... J'étais sûr qu'il devait y avoir un moyen rapide d'obtenir le NSDictionary.
Ragoût du
16
Pour le numéro de version, cela n'a pas d'importance, mais pour d'autres clés que vous voudrez peut-être utiliser à la objectForInfoDictionaryKey:place, car il renvoie la valeur localisée si disponible:[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"]
Zargony
20
Notez dans Xcode4 si vous regardez le panneau de résumé de la cible, vous verrez les champs Version & Build. CFBundleVersiona été réutilisé pour être Build et Version is CFBundleShortVersionString.
memmons
5
Cela récupérera la version et le numéro de build, et les formatera ensemble: NSString *version = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; NSString *build = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]; self.versionLabel.text = [NSString stringWithFormat:@"%@.%@", version, build];
Graham Perks
utilisez CFBundleShortVersionString comme clé pour la méthode objectForKey.
ayalcinkaya
11

pour les utilisateurs de Swift:

if let version = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") {
    print("version is : \(version)")
}

pour les utilisateurs de Swift3:

if let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") {
    print("version is : \(version)")
}
ayalcinkaya
la source
5

Je sais qu'un certain temps s'est écoulé depuis la quête et la réponse.

Depuis iOS8, la réponse acceptée peut ne pas fonctionner.

Voici la nouvelle façon de le faire maintenant:

NSString *version = (__bridge id)CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), kCFBundleVersionKey);
Michael Kessler
la source
6
Avez-vous un lien vers pourquoi il en est ainsi?
Ian Warburton
4

Maintenant, dans iOS 8, les deux champs sont nécessaires. Auparavant, cela fonctionnait sans le CFBundleShortVersionString. Mais maintenant, c'est un champ plist obligatoire pour soumettre une application dans l'App Store. Et kCFBundleVersionKeyest comparé pour le téléchargement de chaque nouvelle version, qui doit être dans un ordre incrémentiel. Spécialement pour les builds TestFlight. Je le fais de cette façon,

NSString * version = nil;
    version = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
    if (!version) {
        version = [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey];
    }
Karim
la source
Merci .. version = [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleShortVersionString"]; travaillé pour moi
swiftBoy
3

Swift 3:

let appBuildNumber = Bundle.main.infoDictionary!["CFBundleVersion"] as! String
let appVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"] as! String
Nitin Nain
la source