Application iOS, obtenir la version de build par programmation

Réponses:

283

La valeur que vous avez définie dans le champ "Version" du résumé de la cible Xcode se trouve ici:

Swift 3

let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as! String

ObjC

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

Swift 2

let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as! String

et le "Build":

Swift 3

let build = Bundle.main.infoDictionary?[kCFBundleVersionKey as String] as? String

ObjC

NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString *)kCFBundleVersionKey];

Swift 2

let build = NSBundle.mainBundle().infoDictionary?[kCFBundleVersionKey as String] as! String
e1985
la source
5
L'utilisation de la chaîne littérale et non de la constante n'est pas à l'épreuve du temps; voir la réponse d'Anupdas pour les clés constantes.
Aaron Brager
9
Vous avez raison pour la @ "CFBundleVersion" - j'ai édité ma réponse. Cependant pour @ "CFBundleShortVersionString" il n'y a pas d'AFAIK constant.
e1985
Pour Swift, NSBundle.mainBundle()c'est maintenantBundle.main
Todd
85

Vous pouvez essayer d'utiliser le infoDictionary

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

NSString *version = infoDictionary[@"CFBundleShortVersionString"];
NSString *build = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]; 
Anupdas
la source
13
kCFBundleVersionKey est la 'version' et non la 'version'
powerj1984
11

Lors de l'utilisation MFMailComposeViewControllerd'un bouton "Contactez-nous", j'utilise ce code pour obtenir un HTML formaté sur l'e-mail de l'utilisateur. Cela me donne toutes les informations dont j'ai besoin pour commencer à résoudre n'importe quel problème:

struct utsname systemInfo;
uname(&systemInfo);

NSDateFormatter *formatter = [[NSDateFormatter alloc]  init];
NSDate  *date = [NSDate date];
[formatter setDateFormat:@"MM/dd/yyyy 'at' hh:mm a"];
NSString *dateString = [formatter stringFromDate:date];

CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenWidth = screenRect.size.width - 65.0;

NSString *comments = NSLocalizedString(@"Please write your comments below:", nil);
NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];
NSString *deviceModel = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
NSString *iOSVersion = [[UIDevice currentDevice] systemVersion];

NSString *emailBody = [NSString stringWithFormat:@"<!DOCTYPE html><html><style> .div {background-color: lightgrey; width: %fpx; padding: 10px; border: 5px solid navy; margin: 2px;}</style><body><div class='div'><p><b>App:</b> %@</p><b><p>Device:</b> %@</p><b><p>iOS Version:</b> %@</p><b><p><p>App Version and Build:</b> %@ (%@)</p><b><p>Date:</b> %@</p> </p></div><font color='red'><b>%@</b></font><br><br></body></html>",screenWidth,appName,deviceModel,iOSVersion,version,build,dateString,comments];

[self setMessageBody:emailBody isHTML:YES];

Voici le résultat lors de la réception du message:

entrez la description de l'image ici

Neowinston
la source
3

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 repo, vérifiez-le:

https://github.com/goktugyil/EZSwiftExtensions

Esqarrouth
la source
Vous devez indiquer clairement que vous êtes propriétaire de ce repo. Vous ne voulez pas passer pour un spammeur.
JAL
2

Détails

  • Version Xcode 10.3 (10G8), Swift 5

Solution

class Info {
    static let dictionary = Bundle.main.infoDictionary ?? [:]
    enum Value {
        case build, version
    }
}

extension Info.Value {

    var key: String {
        switch self {
            case .build: return kCFBundleVersionKey as String
            case .version: return kCFBundleInfoDictionaryVersionKey as String
        }
    }

    var string: String? { return Info.dictionary[key] as? String }
}

Usage

if let value = Info.Value.version.string { print("Version: \(value)") }
if let value = Info.Value.build.string { print("Build: \(value)") }

Résultat

Paramètres du projet

entrez la description de l'image ici

Vasily Bodnarchuk
la source
1

J'ai écrit ce projet open source précisément dans ce but. Mon projet publie des notifications lorsque des événements importants se produisent, par exemple lorsqu'un utilisateur ouvre l'application pour la première fois ou ouvre l'application après la mise à niveau (avec des informations sur la version à partir de laquelle l'utilisateur a mis à niveau). La source est simple et doit être facile à comprendre. Faites-moi savoir si vous avez des questions / demandes.

J'ai également récemment écrit un article de blog à ce sujet.

Stunner
la source
1

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