Comment mon application iphone peut-elle détecter son propre numéro de version?

254

J'écris une application iPhone. Il a déjà été publié, mais je voudrais ajouter une fonctionnalité où son numéro de version est affiché.

Je préfère ne pas avoir à le faire manuellement avec chaque version que je publie ...

Existe-t-il un moyen dans l'objectif-C de savoir quelle est la version de mon application?

Brad Larson
la source
1
Cette question a déjà été répondue ici stackoverflow.com/a/16888788/2890157 .
Akshat Singhal
1
.. la question liée est 4 ans plus tard, donc le vrai problème ici est que cmos n'a jamais accepté de réponse. Quoi qu'il en soit, les réponses à la question liée sont utiles, tout comme les réponses ici. Sur les deux fils, regardez au-delà de la première réponse - parfois, il y a plus d'informations à jour sur une réponse ultérieure.
ToolmakerSteve

Réponses:

222

Comme je le décris ici , j'utilise un script pour réécrire un fichier d'en-tête avec mon numéro de révision Subversion actuel. Ce numéro de révision est stocké dans la constante kRevisionNumber. Je peux ensuite accéder au numéro de version et de révision en utilisant quelque chose de semblable au suivant:

[NSString stringWithFormat:@"Version %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"], kRevisionNumber]

qui va créer une chaîne au format "Version 1.0 (51)".

Brad Larson
la source
152
Cela a renvoyé ma version de construction, j'ai donc utilisé celle-ci. [[[NSBundle mainBundle] infoDictionary] objectForKey: @ "CFBundleShortVersionString"]
jspooner
6
CFBundleVersion est incorrect, car Xcode remplit à tort cette entrée plist avec le numéro de version et non le numéro de version. jspooner est correct.
Oscar
4
Voir stackoverflow.com/questions/6851660/version-vs-build-in-xcode-4 pour une excellente explication des numéros de version vs build. Confirme que CFBundleShortVersionStringce que vous voudriez normalement pour la «version» et le CFBundleVersionnuméro de build.
Rory
3
kRevisionNumber ne semble pas fonctionner pour moi. Pour obtenir la sortie spécifiée, je l'ai fait (en utilisant le correctif de @jspooner):[NSString stringWithFormat:@"Version: %@ (%@)", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"], [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]]
Adam
147

En s'appuyant sur la réponse de Brad Larson, si vous avez des informations sur les versions principales et mineures stockées dans la liste d'informations (comme je l'ai fait pour un projet particulier), cela a bien fonctionné pour moi:

- (NSString *)appNameAndVersionNumberDisplayString {
    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
    NSString *appDisplayName = [infoDictionary objectForKey:@"CFBundleDisplayName"];
    NSString *majorVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
    NSString *minorVersion = [infoDictionary objectForKey:@"CFBundleVersion"];

    return [NSString stringWithFormat:@"%@, Version %@ (%@)", 
                appDisplayName, majorVersion, minorVersion];
}

Maintenant, faire tourner une version mineure manuellement peut être difficile, et donc utiliser une astuce de numéro de révision du référentiel source est idéal. Si vous ne l'avez pas lié (comme je ne l'avais pas fait), l'extrait ci-dessus peut être utile. Il extrait également le nom d'affichage de l'application.

idStar
la source
59

Version Swift pour les deux séparément:

Swift 3

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

Swift 2

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

Son inclus dans ce dépôt, consultez-le:

https://github.com/goktugyil/EZSwiftExtensions

Esqarrouth
la source
42

C'est ce que j'ai fait dans ma candidature

NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

Espérons que cette réponse simple aidera quelqu'un ...

Arkady
la source
1
Pour mes besoins, c'est super. Merci. +1
David DelMonte
1
Cela renvoie le nom de la version, pas la version
chancyWu
@chancyWu, CFBundleShortVersionString semble donner la version.
Brian F Leighty
31

Vous pouvez spécifier la CFBundleShortVersionStringchaîne dans votre plist.info et la lire par programme en utilisant l' API fournie .

Jasper Bekkers
la source
30

Il y a deux choses - la version de construction et la version d'application.

  1. Pour obtenir la version de l'application:

    NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
  2. Pour obtenir la version Build:

    NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
Shaik Riyaz
la source
Y a-t-il une différence entre ces deux? Ils me retournent tous les deux la même chose.
jjnevis
Oui, votre numéro de build et la version de l'application peuvent être identiques dans les paramètres.
Shaik Riyaz
D'accord, je n'ai qu'un seul paramètre dans mon RAKEFILE - app.version (j'utilise RubyMotion). Je suppose que l'un ou l'autre fera pour mes besoins. Merci
jjnevis
Merci mon pote. Fonctionné en douceur.
Felipe
1
FYI Il est préférable d'utiliser objectForInfoDictionaryKey:au lieu de infoDictionary] objectForKey:car le premier retourne la valeur localisée (s'il y en a une). Cela ne fera probablement pas de différence ici;)
deanWombourne
17
// Syncs with App Store and Xcode Project Settings Input
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
John Erck
la source
1
Exactement ce dont j'avais besoin!
Julius
16

Une manière succincte d'obtenir une chaîne de version au format XYZ est:

[NSBundle mainBundle].infoDictionary[@"CFBundleVersion"]

Ou, pour juste XY:

[NSBundle mainBundle].infoDictionary[@"CFBundleShortVersionString"]

Ces deux extraits renvoient des chaînes que vous affecteriez à la propriété de texte de votre objet d'étiquette, par exemple

myLabel.text = [NSBundle mainBundle].infoDictionary[@"CFBundleVersion"];
rodamn
la source
7

Vous pouvez essayer d'utiliser le dictionnaire comme: -

NSDictionary *infoDictionary = [[NSBundle mainBundle]infoDictionary];

NSString *buildVersion = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]
Abhishek Verma
la source
4

Lisez le fichier info.plist de votre application et obtenez la valeur de la clé CFBundleShortVersionString. Lire info.plist vous donnera un objet NSDictionary

lostInTransit
la source
4

Vous pouvez utiliser l'infoDictionary qui obtient les détails de la version de info.plist de votre application. Ce code fonctionne pour swift 3. Appelez simplement cette méthode et affichez la version dans n'importe quel élément d'interface utilisateur préféré.

Swift-3  

func getVersion() -> String {
    let dictionary = Bundle.main.infoDictionary!
    let version = dictionary["CFBundleShortVersionString"] as! String
    let build = dictionary["CFBundleVersion"] as! String
    return "v\(version).\(build)"
}
rajat chauhan
la source
3

Swift 5:

Il y a deux choses - la version de l'application et la version de build

  • Pour obtenir la version de l'application:

     if let appVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
          // present appVersion
    }
  • Pour obtenir la version Build:

     if let buildVersion = Bundle.main.infoDictionary?["CFBundleVersion"] as? String {
          // present buildVersion
     }

Merci @Brad Larson♦beaucoup

dengST30
la source
1

Si vous avez besoin d'une combinaison à la fois de version et de numéro de build , voici un bref moyen d'utiliser Swift 3 :

let appVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"]!
let buildNum = Bundle.main.infoDictionary!["CFBundleVersion"]!
let versionInfo = "\(appVersion) (build \(buildNum))"
// versionInfo is now something like "2.3.0 (build 17)"

Ajoutez un as! Stringà la fin de la ligne appVersionou buildNumpour n'obtenir que cette partie en tant Stringqu'objet. Pas besoin de ça si vous cherchez le pleinversionInfo .

J'espère que ça aide!

Jeehut
la source
1
func getAppVersion() -> String {
    let dictionary = Bundle.main.infoDictionary!
    let versionValue = dictionary["CFBundleShortVersionString"] ?? "0"
    let buildValue = dictionary["CFBundleVersion"] ?? "0"
    return "\(versionValue) (build \(buildValue))"
}

Basé sur la réponse @rajat chauhan sans transtypage forcé String.

apex39
la source
0

C'est une bonne chose à gérer avec un système de contrôle des révisions. De cette façon, lorsque vous obtenez un rapport de bogue d'un utilisateur, vous pouvez vérifier cette révision de code et (espérons-le) reproduire le bogue en exécutant exactement le même code que l'utilisateur.

L'idée est que chaque fois que vous effectuez une génération, vous exécuterez un script qui obtient le numéro de révision actuel de votre code et met à jour un fichier dans votre projet (généralement avec une certaine forme de remplacement de jeton). Vous pouvez ensuite écrire une routine de gestion des erreurs qui inclut toujours le numéro de révision dans la sortie d'erreur, ou vous pouvez l'afficher sur une page "À propos".

RedFilter
la source
0

Vous pouvez essayer cette méthode:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
BatyrCan
la source