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.

Jovan
la source

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

Ashley Mills
la source
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)")
Crashalot
la source
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"]; 
Vaibhav Shiledar
la source
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
Ravindra Kishan
la source
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]);
Stunner
la source
0

Juste pour note

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

akaDualité
la source
-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

Esqarrouth
la source
CFBundleVersionKey ne fonctionne plus sur Xcode 8 et Swift 3. Connaissez-vous la nouvelle clé?
Crashalot
En voici une à jour: github.com/goktugyil/EZSwiftExtensions/blob/…
Esqarrouth