web-dev-qa-db-fra.com

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

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

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

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

249
cmos

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 à la version et au numéro de révision en utilisant quelque chose de similaire au suivant:

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

ce qui créera une chaîne du format "Version 1.0 (51)".

219
Brad Larson

S'appuyant sur la réponse de Brad Larson, si vous avez des informations de version majeure et mineure stockées dans le pliste info (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, réviser manuellement une version mineure peut être un problème, et l’utilisation d’un numéro de révision du référentiel source est donc idéale. 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.

147
idStar

Version rapide 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 repo, regardez-le:

https://github.com/goktugyil/EZSwiftExtensions

56
Esqarrouth

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 ...

42
Arkady

Vous pouvez spécifier la chaîne CFBundleShortVersionString dans votre fichier plist.info et la lire par programme à l'aide de API fournie .

31
Jasper Bekkers

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

  1. Pour obtenir la version de l'application:

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

    NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
    
30
Shaik Riyaz
// Syncs with App Store and Xcode Project Settings Input
NSString *appVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
17
John Erck

Une manière succincte d’obtenir une chaîne de version au format X.Y.Z est:

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

Ou, pour juste X.Y:

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

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

myLabel.text = [NSBundle mainBundle].infoDictionary[@"CFBundleVersion"];
16
rodamn

Vous pouvez essayer d'utiliser dictionnaire comme: -

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

NSString *buildVersion = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]
7
Abhishek Verma

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)"
}
4
rajat chauhan

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

4
lostInTransit

Si vous avez besoin d'une combinaison des deux version et de build num, voici un bref moyen d'utilisation de - Swift:

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 appVersion ou buildNum pour obtenir uniquement cette partie sous la forme d'un objet String. Pas besoin de ça si vous cherchez la version complète versionInfo.

J'espère que ça aide!

1
Dschee

Vous pouvez essayer cette méthode:

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

C'est une bonne chose à gérer avec un système de contrôle de révision. Ainsi, lorsque vous recevez un rapport de bogue d'un utilisateur, vous pouvez vérifier cette révision de code et (espérons-le) reproduire le bogue qui exécute exactement le même code que l'utilisateur.

L'idée est que chaque fois que vous construisez, vous allez exécuter un script qui récupère le numéro de révision actuel de votre code et met à jour un fichier au sein de votre projet (généralement avec une forme de remplacement de jeton). Vous pouvez ensuite écrire une routine de traitement des erreurs qui inclut toujours le numéro de révision dans la sortie d'erreur ou vous pouvez l'afficher dans une page "À propos de".

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

Basé sur @rajat chauhan, répondez sans transtypage forcé à String.

0
apex39