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