Как мне получить текущую версию моего проекта iOS в коде?


152

Я хотел бы иметь возможность получить текущую версию моего проекта / приложения для iOS в качестве NSStringобъекта, не определяя где-либо константу в файле. Я не хочу менять значение версии в 2 местах.

Значение должно быть обновлено, когда я добавлю свою версию в сводную информацию о цели проекта.

Ответы:


382

Вы можете получить версию и номера сборки следующим образом:

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

или в Objective-C

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

У меня есть следующие методы в категории 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))"
    }
}

Суть: https://gist.github.com/ashleymills/6ec9fce6d7ec2a11af9b


Вот эквивалент в 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;
}

Суть: https://gist.github.com/ashleymills/c37efb46c9dbef73d5dd


1
Вы можете использовать этот [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleVersion"] вместо [[[NSBundle mainBundle] objectForInfoDictionaryKey: (NSString *) kCFBundleVersionKey]. ]; так что теперь стало легко хранить в памяти
Durai Amuthan.H

4
@Duraiamuthan Я бы рекомендовал использовать, (NSString *)kCFBundleVersionKeyа не @"CFBundleVersion". Несмотря на то, что он дольше печатается (здесь поможет автозаполнение), так как это константа, проверяемая во время компиляции.
Эшли Миллс

Кстати, было бы точнее включить это расширение, NSBundleвместо UIApplicationэтого также можно будет заменить статические вызовы вызовами экземпляра.
Запко

@Запко - я с уважением не согласен. Концептуально это соответствует тому UIApplication, что возвращаемая информация о приложении. Кроме того, это относится только к mainпакету - не имеет смысла делать это методом экземпляра для любого пакета.
Эшли Миллс

Вы имели в виду, buildкогда сказали appBundle(во второй строке своего кода)?
user1046037

14

Вот что работает на 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

В Задаче C:

1) Для получения версии приложения вы должны использовать:

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

2) Для получения версии сборки вы должны использовать:

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

1

В Swift вы можете получить версию пакета, используя:

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

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

versionLabel.text = "Version:" + version

0

Мой проект с открытым исходным кодом, App Update Tracker , предлагает эту функциональность (и многое другое) в форме методов класса:

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

Вы бы использовали это так:

#import "AppUpdateTracker.h"

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

0

Просто для заметки

Чтобы получить локализованное значение любого ключа, вы должны использовать CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), "CFBundleShortVersionString" as CFString)


-1

Так вот версия Swift для обоих по отдельности:

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

Это включено в этот репо, проверьте это:

https://github.com/goktugyil/EZSwiftExtensions


CFBundleVersionKey больше не работает на Xcode 8 и Swift 3. Знаете ли вы новый ключ?
Crashalot

Вот до даты одного: github.com/goktugyil/EZSwiftExtensions/blob/...
Esqarrouth
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.