Как мне получить текущую версию моего проекта 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)")
Crashalot
источник
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)

akaDuality
источник
-1

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

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

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

https://github.com/goktugyil/EZSwiftExtensions

Esqarrouth
источник
CFBundleVersionKey больше не работает на Xcode 8 и Swift 3. Знаете ли вы новый ключ?
Crashalot
Вот до даты одного: github.com/goktugyil/EZSwiftExtensions/blob/...
Esqarrouth