iOS App, programmgesteuert Build-Version erhalten

Antworten:

284

Der Wert, den Sie im Feld "Version" der Xcode-Zielzusammenfassung festgelegt haben, befindet sich hier:

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

und der "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
quelle
5
Die Verwendung des String-Literals und nicht der Konstante ist nicht zukunftssicher. Siehe Anupdas 'Antwort für die konstanten Schlüssel.
Aaron Brager
9
Sie sind richtig für die @ "CFBundleVersion" - Ich habe meine Antwort bearbeitet. Für @ "CFBundleShortVersionString" gibt es jedoch keine konstante AFAIK.
e1985
Für Swift NSBundle.mainBundle()ist jetztBundle.main
Todd
85

Sie können versuchen, das infoDictionary zu verwenden

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

NSString *version = infoDictionary[@"CFBundleShortVersionString"];
NSString *build = infoDictionary[(NSString*)kCFBundleVersionKey];
NSString *bundleName = infoDictionary[(NSString *)kCFBundleNameKey]; 
Anupdas
quelle
13
kCFBundleVersionKey ist die 'Build' nicht 'Version'
powerj1984
11

Bei Verwendung MFMailComposeViewControllereiner Schaltfläche "Kontakt" verwende ich diesen Code, um vom Benutzer einen formatierten HTML-Code für die E-Mail zu erhalten. Es gibt mir alle Informationen, die ich brauche, um bei der Lösung eines Problems zu helfen:

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

Dies ist das Ergebnis beim Abrufen der Nachricht:

Geben Sie hier die Bildbeschreibung ein

Neowinston
quelle
3

Schnelle Version für beide separat:

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

Es ist in diesem Repo enthalten, probieren Sie es aus:

https://github.com/goktugyil/EZSwiftExtensions

Esqarrouth
quelle
Sie sollten klarstellen, dass Sie dieses Repo besitzen. Sie wollen nicht als Spammer abschneiden.
JAL
2

Einzelheiten

  • Xcode Version 10.3 (10G8), Swift 5

Lösung

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

Verwendung

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

Ergebnis

Projekt Einstellungen

Geben Sie hier die Bildbeschreibung ein

Wassili Bodnarchuk
quelle
1

Ich habe dieses Open Source-Projekt genau zu diesem Zweck geschrieben. In meinem Projekt werden Benachrichtigungen veröffentlicht, wenn wichtige Ereignisse auftreten, z. B. wenn ein Benutzer die App zum ersten Mal öffnet oder wenn er die App nach dem Upgrade öffnet (einschließlich Informationen darüber, von welcher Version der Benutzer ein Upgrade durchgeführt hat). Die Quelle ist unkompliziert und sollte leicht zu verstehen sein. Lassen Sie mich wissen, wenn Sie Fragen / Wünsche haben.

Ich habe auch kürzlich einen Blog-Beitrag darüber geschrieben.

Stunner
quelle
1

1) Um die App-Version zu erhalten, müssen Sie Folgendes verwenden:

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

2) Um die Build-Version zu erhalten, müssen Sie Folgendes verwenden:

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