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.