Jak uzyskać obecną wersję mojego projektu iOS w kodzie?

151

Chciałbym móc pobrać aktualną wersję mojego projektu / aplikacji na iOS jako NSStringobiekt bez konieczności definiowania gdzieś stałej w pliku. Nie chcę zmieniać wartości mojej wersji w 2 miejscach.

Wartość musi zostać zaktualizowana, gdy podbijam moją wersję w podsumowaniu celu projektu.

Jovan
źródło

Odpowiedzi:

381

Możesz pobrać wersję i numery kompilacji w następujący sposób:

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 {

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

Streszczenie: 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

Ashley Mills
źródło
1
Możesz użyć tego [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleVersion"] zamiast [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *) kCFBundleVersionKey]. Dawny wydaje się dobrze współgrać z [[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *) kCFBundleVersionKey]. ]; Więc teraz stało się to łatwe do zapamiętania
Durai Amuthan.H
4
@Duraiamuthan Zalecam używanie (NSString *)kCFBundleVersionKeyzamiast @"CFBundleVersion". Mimo że wpisywanie jest dłuższe (pomoże tutaj autouzupełnianie), ponieważ jest to stała, która jest sprawdzana podczas kompilacji.
Ashley Mills
Przy okazji, dokładniejsze byłoby włączenie tego rozszerzenia NSBundlezamiast UIApplicationtego, co pozwoli również zastąpić statyczne wywołania instancją.
Zapko,
@Zapko - Z całym szacunkiem się nie zgadzam. Koncepcyjnie to pasuje UIApplication, ponieważ zwracane informacje dotyczą aplikacji. Dotyczy to również tylko mainpakietu - nie ma sensu traktować tej metody instancji w jakimkolwiek pakiecie.
Ashley Mills,
Czy chodziło Ci o to, buildkiedy powiedziałeś appBundle(w drugiej linii kodu)?
user1046037
14

Oto, co zadziałało w 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
źródło
3

W celu C:

1) Aby uzyskać wersję aplikacji, musisz użyć:

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

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

NSString *buildVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; 
Vaibhav Shiledar
źródło
1

W Swift możesz uzyskać wersję pakietu, używając:

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

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

versionLabel.text = "Version:" + version
Ravindra Kishan
źródło
0

Mój projekt open source, App Update Tracker , oferuje tę funkcjonalność (i nie tylko) w postaci metod klasowych:

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

Używałbyś tego w ten sposób:

#import "AppUpdateTracker.h"

NSLog(@"short version: %@", [AppUpdateTracker getShortVersionString]);
NSLog(@"long version: %@", [AppUpdateTracker getLongVersionString]);
Szlagier
źródło
0

Tylko dla notatki

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

akaDuality
źródło
-1

Oto wersja Swift dla obu z nich osobno:

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

Jest uwzględniony w tym repozytorium, sprawdź to:

https://github.com/goktugyil/EZSwiftExtensions

Esqarrouth
źródło
CFBundleVersionKey nie działa już w Xcode 8 i Swift 3. Czy znasz nowy klucz?
Crashalot,