App iOS, ottieni a livello di codice la versione di build


Risposte:


283

Il valore impostato nel campo "Versione" del riepilogo del target Xcode è qui:

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

e la "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

5
L'uso della stringa letterale e non della costante non è a prova di futuro; vedi la risposta di Anupdas per le chiavi costanti.
Aaron Brager,

9
Hai ragione per @ "CFBundleVersion" - Ho modificato la mia risposta. Tuttavia per @ "CFBundleShortVersionString" non esiste un AFAIK costante.
e1985,

Per Swift, NSBundle.mainBundle()è oraBundle.main
Todd

85

Puoi provare a utilizzare infoDictionary

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

NSString *version = infoDictionary[@"CFBundleShortVersionString"];
NSString *build = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]; 

13
kCFBundleVersionKey è la 'build' non 'version'
powerj1984

11

Quando utilizzo MFMailComposeViewControllerper un pulsante "Contattaci", utilizzo questo codice per ottenere un HTML formattato sull'e-mail dell'utente. Mi dà tutte le informazioni di cui ho bisogno per iniziare a risolvere qualsiasi problema:

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];

Questo è il risultato quando si ottiene il messaggio:

inserisci qui la descrizione dell'immagine


3

Versione rapida per entrambi separatamente:

let versionNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") as! String
let buildNumber = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleVersion") as! String

È incluso in questo repository, dai un'occhiata:

https://github.com/goktugyil/EZSwiftExtensions


Dovresti chiarire che possiedi quel repository. Non vuoi venire come spammer.
JAL,

2

Dettagli

  • Xcode versione 10.3 (10G8), Swift 5

Soluzione

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

uso

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

Risultato

Impostazioni del progetto

inserisci qui la descrizione dell'immagine


1

Ho scritto questo progetto open source proprio per questo scopo. Il mio progetto pubblica notifiche quando si verificano eventi significativi, ad esempio quando un utente apre l'app per la prima volta o apre l'app dopo l'aggiornamento (completo di informazioni sulla versione da cui l'utente ha effettuato l'aggiornamento). La fonte è semplice e dovrebbe essere facile da capire. Fammi sapere se hai domande / richieste.

Di recente ho anche scritto un post sul blog al riguardo.


1

1) Per ottenere la versione dell'app devi usare un:

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

2) Per ottenere la versione Build devi usare un:

NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.