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.