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.

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


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

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

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

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

0

Tylko dla notatki

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


-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


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.