iOS: доступ к переменным app-info.plist в коде

Я работаю над универсальным приложением и хотел бы получить доступ к значениям, хранящимся в файле app-info.plist в моем коде.

Причина: я динамически создаю экземпляр UIViewController из раскадровки, используя:

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
self = [storyboard instantiateViewControllerWithIdentifier:@"ExampleViewController"];

Теперь имя раскадровки @"MainStoryboard_iPhone" выглядит некрасиво.

Я хочу сделать что-то вроде:

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:appInfo.mainStoryboardBaseNamePhone bundle:nil];
self = [storyboard instantiateViewControllerWithIdentifier:@"ExampleViewController"];

где appInfo может быть NSDictionary всех значений в app-info.plist


person sherlock    schedule 02.03.2012    source источник


Ответы (5)


Атрибуты из info.plist для вашего проекта напрямую доступны с помощью следующих...

[[NSBundle mainBundle] objectForInfoDictionaryKey:key_name];

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

NSString *appVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"];

Есть загвоздка в том, что номер версии теперь имеет два атрибута в info.plist, но вы поняли? Если вы просматриваете свой info.plist как исходный код (щелкните правой кнопкой мыши info.plist — выберите «Открыть как»), вы увидите все различные имена ключей, которые вы можете использовать.

person Damo    schedule 02.03.2012
comment
Как упоминалось @Answerbot в этом сообщении: stackoverflow.com/a/4059118/1210822: CFBundleVersion был переназначен для сборки и Version — CFBundleShortVersionString, поэтому теперь для получения номера версии из plist нам нужно использовать: NSString *version = [[NSBundle mainBundle] objectForInfoDictionaryKey:@CFBundleShortVersionString]; - person sonoshin; 30.10.2012
comment
для 11.3 это не работает, т.к. NSBundle был переименован и в новом Bundle он еще не включен. У xou есть обновление? - person Yvonne Marggraf; 15.08.2018
comment
Если у меня есть корпоративное приложение для iOS, которое распространяется через Интернет, могу ли я добавить пары «ключ-значение» в файл PLIST и впоследствии прочитать эти значения из приложения во время загрузки? - person Brant; 08.11.2019
comment
как мы можем обновить значение CFBundleVersion из AppDelegate.m? - person pragnesh; 24.06.2020

Синтаксис Swift 4+ для решения Damo

Bundle.main.object(forInfoDictionaryKey: "KEY_NAME")

Пример

let appVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion")
person Maverick    schedule 01.11.2017
comment
Для начинающих, таких как я, Bundle требуется import SystemConfiguration - person GrafOrlov; 15.11.2019

Ну, вы можете очень легко получить доступ к info.plist:

Получение названия раскадровки:

NSString *storyboard  = [[NSBundle mainBundle].infoDictionary objectForKey:@"UIMainStoryboardFile"];

Не уверен, что он обнаружит, находится ли он в iPad, и должен использовать установленный ключ UIMainStoryboardFile~ipad.

person rckoenes    schedule 02.03.2012
comment
XCode автоматически заполняет ключ «UIMainStoryboardFile» файлами раскадровки iPhone/iPad, в зависимости от устройства :) - person sherlock; 16.03.2012

Вы также можете использовать метод infoDictionary в NSBundle:

NSDictionary *infoPlistDict = [[NSBundle mainBundle] infoDictionary];
NSString *version = infoPlistDict[@"CFBundleVersion"];
person svth    schedule 23.11.2015

person    schedule
comment
Вы также можете использовать NSDictionary: NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path]; - person Darius Miliauskas; 07.03.2015