Як отримати поточну версію свого проекту iOS в коді?


151

Я хотів би мати можливість отримати поточну версію мого проекту / програми iOS як NSStringоб’єкт, не потребуючи десь визначати константу у файлі. Я не хочу змінювати значення своєї версії в 2 місцях.

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

Відповіді:


381

Ви можете отримати версію та створити номери наступним чином:

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] об'єктForInfoDictionaryKey: @ "CFBundleVersion"] замість [[NSBundle mainBundle] об'єктаForInfoDictionaryKey: (NSString *). ]; тому тепер стало легко зберігати в пам’яті
Дурай Амутхан.H

4
@Duraiamuthan рекомендую (NSString *)kCFBundleVersionKeyскоріше використовувати @"CFBundleVersion". Навіть незважаючи на те, що вводити його довше (автоматичне завершення допоможе тут), оскільки це константа, що перевіряється під час компіляції.
Ешлі Міллс

Btw, точніше було б зробити це розширення NSBundleзамість UIApplicationцього, що також дозволить замінити статичні виклики на екземпляри.
Запко

@Zapko - я з повагою не згоден. Концептуально це відповідає UIApplication, оскільки повернута інформація стосується програми. Також це стосується лише mainпакета - не було б сенсу робити цей метод примірника на будь-якому пакеті.
Ешлі Міллс

Ви мали на увазі, buildколи говорили appBundle(у другому рядку коду)?
користувач1046037

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) Для отримання версії Build ви повинні використовувати:

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

Мій проект з відкритим кодом, моє оновлення додатків , пропонує цю функціональність (та більше) у вигляді методів класу:

  • + (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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.