Comment obtenir la version actuelle de mon projet iOS dans le code?


152

Je voudrais pouvoir obtenir la version actuelle de mon projet / application iOS en tant NSStringqu'objet sans avoir à définir une constante dans un fichier quelque part. Je ne veux pas changer la valeur de ma version à deux endroits.

La valeur doit être mise à jour lorsque je passe ma version dans le résumé de la cible du projet.

Réponses:


382

Vous pouvez obtenir la version et les numéros de build comme suit:

let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
let build = Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String

ou en Objective-C

NSString * version = [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString"];
NSString * build = [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *)kCFBundleVersionKey];

J'ai les méthodes suivantes dans une catégorie sur UIApplication:

extension UIApplication {

    static var appVersion: String {
        return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String
    }

    static var appBuild: String {
        return Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String
    }

    static var versionBuild: String {
        let version = appVersion, build = appBuild            
        return version == build ? "v\(version)" : "v\(version)(\(build))"
    }
}

Gist: https://gist.github.com/ashleymills/6ec9fce6d7ec2a11af9b


Voici l'équivalent en Objective-C:

+ (NSString *) appVersion
{
    return [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString"];    
}

+ (NSString *) build
{
    return [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *)kCFBundleVersionKey];
}

+ (NSString *) versionBuild
{
    NSString * version = [self appVersion];
    NSString * build = [self build];

    NSString * versionBuild = [NSString stringWithFormat: @"v%@", version];

    if (![version isEqualToString: build]) {
        versionBuild = [NSString stringWithFormat: @"%@(%@)", versionBuild, build];
    }

    return versionBuild;
}

Gist: https://gist.github.com/ashleymills/c37efb46c9dbef73d5dd


1
Vous pouvez utiliser cette [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleVersion"] au lieu de [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *) kCFBundleVersionKey] .La Ancien semble rimer bien avec [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleShortVersionString" ]; donc Maintenant, il est devenu facile de garder en mémoire
Durai Amuthan.H

4
@Duraiamuthan Je recommanderais d'utiliser (NSString *)kCFBundleVersionKeyplutôt que @"CFBundleVersion". Même s'il est plus long à taper (la saisie semi-automatique aidera ici), car c'est une constante, elle est vérifiée au moment de la compilation.
Ashley Mills

Btw, il serait plus précis d'activer cette extension au NSBundlelieu de UIApplicationcela permettra également de remplacer les appels statiques par ceux d'instance.
Zapko

@Zapko - Je suis respectueusement en désaccord. Conceptuellement, cela correspond UIApplication, car les informations renvoyées concernent l'application. De plus, cela ne s'applique qu'au mainbundle - cela n'aurait aucun sens d'en faire une méthode d'instance sur n'importe quel bundle.
Ashley Mills

Vouliez-vous dire buildquand vous avez dit appBundle(dans la deuxième ligne de votre code)?
user1046037

14

Voici ce qui a fonctionné sur Xcode 8, Swift 3:

let gAppVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") ?? "0"
let gAppBuild = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion") ?? "0"

print("Version: \(gAppVersion)")
print("Build: \(gAppBuild)")

3

Dans l'objectif C:

1) Pour obtenir la version de l'application, vous devez utiliser un:

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

2) Pour obtenir la version Build, vous devez utiliser un:

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

1

Dans Swift, vous pouvez obtenir la version du bundle en utilisant:

let info:NSDictionary = NSBundle.mainBundle().infoDictionary!

let version:String = info.objectForKey("CFBundleShortVersionString") as! String

versionLabel.text = "Version:" + version

0

Un de mes projets open source, App Update Tracker , offre cette fonctionnalité (et plus) sous la forme de méthodes de classe:

  • + (NSString *)getShortVersionString
  • + (NSString *)getLongVersionString

Vous l'utiliseriez comme ceci:

#import "AppUpdateTracker.h"

NSLog(@"short version: %@", [AppUpdateTracker getShortVersionString]);
NSLog(@"long version: %@", [AppUpdateTracker getLongVersionString]);

0

Juste pour note

Pour obtenir la valeur localisée de n'importe quelle clé, vous devez utiliser CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)


-1

Voici donc une 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 dépôt, vérifiez-le:

https://github.com/goktugyil/EZSwiftExtensions


CFBundleVersionKey ne fonctionne plus sur Xcode 8 et Swift 3. Connaissez-vous la nouvelle clé?
Crashalot

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.