Читать версию с Info.plist

Ответы:

202

Вы можете читать свой Info.plist как словарь с

[[NSBundle mainBundle] infoDictionary]

И таким образом можно легко получить версию под CFBundleVersionключ.

Наконец, вы можете получить версию с

NSDictionary* infoDict = [[NSBundle mainBundle] infoDictionary];
NSString* version = [infoDict objectForKey:@"CFBundleVersion"];
gcamp
источник
Отлично. Это намного проще, чем все строки функций CF *, которые я использовал ... Я был уверен, что должен был быть быстрый способ получить NSDictionary.
Stew
16
Для номера версии это не имеет значения, но для других ключей вы, возможно, захотите использовать objectForInfoDictionaryKey:вместо этого, поскольку он возвращает локализованное значение, если оно доступно:[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"]
Zargony
20
Обратите внимание, что в Xcode4, если вы посмотрите на сводную панель цели, вы увидите поля Версия и Сборка. CFBundleVersionбыл перепрофилирован на сборку и версию CFBundleShortVersionString.
memmons
5
Это позволит получить версию и номер сборки и отформатировать их вместе: NSString *version = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; NSString *build = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]; self.versionLabel.text = [NSString stringWithFormat:@"%@.%@", version, build];
Грэм Перкс,
используйте CFBundleShortVersionString в качестве ключа для метода objectForKey.
ayalcinkaya
11

для пользователей Swift:

if let version = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString") {
    print("version is : \(version)")
}

для пользователей Swift3:

if let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") {
    print("version is : \(version)")
}
Аялчинкая
источник
5

Я знаю, что прошло какое-то время с момента квеста и ответа.

С iOS8 принятый ответ может не сработать.

Это новый способ сделать это сейчас:

NSString *version = (__bridge id)CFBundleGetValueForInfoDictionaryKey(CFBundleGetMainBundle(), kCFBundleVersionKey);
Майкл Кесслер
источник
6
У вас есть ссылка, почему это так?
Ян Уорбертон,
4

Теперь в iOS 8 необходимы оба поля. Раньше он работал без CFBundleShortVersionString. Но теперь это обязательное поле plist для отправки любого приложения в магазин приложений. И kCFBundleVersionKeyсравнивается для загрузки каждой новой сборки, которая должна выполняться в возрастающем порядке. Специально для сборок TestFlight. Я так делаю,

NSString * version = nil;
    version = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
    if (!version) {
        version = [[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey];
    }
Карим
источник
Спасибо .. version = [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleShortVersionString"]; работал у меня
swiftBoy
3

Swift 3:

let appBuildNumber = Bundle.main.infoDictionary!["CFBundleVersion"] as! String
let appVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"] as! String
Нитин Наин
источник