2011-09-30 45 views
125

Chciałbym móc uzyskać aktualną wersję mojego projektu i aplikacji iOS jako obiektu NSString bez konieczności definiowania stałej w pliku gdzieś. Nie chcę zmieniać wartości wersji w 2 miejscach.Jak uzyskać aktualną wersję mojego projektu iOS w kodzie?

Wartość należy zaktualizować po kliknięciu mojej wersji w podsumowaniu celu projektu.

Odpowiedz

330

można uzyskać wersję i budować liczb następująco:

let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String 
let build = Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String 

lub w Objective-C

NSString * version = [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleShortVersionString"]; 
NSString * build = [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *)kCFBundleVersionKey]; 

Mam następujące metody w kategorii na UIApplication:

extension UIApplication { 

    class func appVersion() -> String { 
     return Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String 
    } 

    class func appBuild() -> String { 
     return Bundle.main.object(forInfoDictionaryKey: kCFBundleVersionKey as String) as! String 
    } 

    class func versionBuild() -> String { 
     let version = appVersion(), build = appBuild() 

     return version == build ? "v\(version)" : "v\(version)(\(build))" 
    } 
} 

Gist:https://gist.github.com/ashleymills/6ec9fce6d7ec2a11af9b


Oto odpowiednik w 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; 
} 

Streszczenie:https://gist.github.com/ashleymills/c37efb46c9dbef73d5dd

+1

Można to wykorzystać [ [NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleVersion"] zamiast [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *) kCFBundleVersionKey].Wydaje się, że Former dobrze rymuje się z [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleShortVersionString"]; Więc teraz stało się łatwo zachować w pamięci –

+4

@Duraiamuthan Polecam używanie '(NSString *) kCFBundleVersionKey' zamiast' @ "CFBundleVersion" '. Mimo, że jest już dłuższy typ (automatyczne uzupełnianie pomoże tutaj), ponieważ jest to stała jest sprawdzana podczas kompilacji. –

+0

Btw, byłoby bardziej dokładne uczynienie tego rozszerzenia na 'NSBundle' zamiast' UIApplication' to również pozwoli na zastąpienie połączeń statycznych z instancjami. – Zapko

2

w Swift, można dostać wersję wiązki za pomocą:

let info:NSDictionary = NSBundle.mainBundle().infoDictionary! 

let version:String = info.objectForKey("CFBundleShortVersionString") as! String 

versionLabel.text = "Version:" + version 
1

projekt open source, App Update Tracker Oferuje tej funkcji (i więcej) w postaci metod klasy:

  • + (NSString *)getShortVersionString
  • + (NSString *)getLongVersionString

będzie go używać tak:

#import "AppUpdateTracker.h" 

NSLog(@"short version: %@", [AppUpdateTracker getShortVersionString]); 
NSLog(@"long version: %@", [AppUpdateTracker getLongVersionString]); 
0

Więc heres Swift oddzielnie dla obu:

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

Jego zawarte w tym repo, to sprawdzić:

https://github.com/goktugyil/EZSwiftExtensions

+0

CFBundleVersionKey nie działa już w Xcode 8 i Swift 3. Czy znasz nowy klucz? – Crashalot

+0

Oto aktualny: https://github.com/goktugyil/EZSwiftExtensions/blob/b06d55a8f5d4fda9f5bca03af4863252dcf53e10/Sources/EZSwiftFunctions.swift – Esqarrouth

2

w Objective C:

1) dla uzyskania wersję aplikacji trzeba użyć:

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

2) Aby uzyskać wersję kompilacji, musisz użyć:

NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; 
11

Oto co działało na 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)") 
0

Tylko uwaga

Aby uzyskać zlokalizowaną wartość dowolnego klawisza należy używać CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)

Powiązane problemy