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

103

Я работаю над универсальным приложением и хочу получить доступ к значениям, хранящимся в файле 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

шерлок
источник

Ответы:

253

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

[[NSBundle mainBundle] objectForInfoDictionaryKey:key_name];

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

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

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

Дамо
источник
5
Как упомянул @Answerbot в этом сообщении: stackoverflow.com/a/4059118/1210822 : «CFBundleVersion перепрофилирован на Build, а версия - на CFBundleShortVersionString», поэтому теперь для получения номера версии из plist нам нужно использовать: NSString * версия = [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleShortVersionString"];
sonoshin
для 11.3 это не работает, потому что NSBundle был переименован, а в новый Bundle он еще не включен. Есть ли у вас обновление?
Ивонн Маргграф,
Если у меня есть приложение Enterprise iOS, которое распространяется через Интернет, могу ли я добавить пары ключ / значение в файл PLIST и впоследствии прочитать эти значения из приложения во время загрузки?
Brant
как мы можем обновить значение CFBundleVersion из AppDelegate.m?
прагнешь
27

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

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

пример

let appVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion")
Maverick
источник
Для таких новичков, как я, Bundleтребуетсяimport SystemConfiguration
GrafOrlov
12

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

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

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

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

rckoenes
источник
6
XCode автоматически заполняет ключ 'UIMainStoryboardFile' файлами раскадровки iPhone / iPad, в зависимости от устройства :)
Шерлок,
8
NSString *path = [[NSBundle mainBundle] pathForResource: @"YOURPLISTNAME" ofType: @"plist"]; 
NSMutableDictionary *dictplist =[[NSMutableDictionary alloc] initWithContentsOfFile:path];
Джеймс Лобо
источник
Вы также можете использовать NSDictionary:NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
Darius Miliauskas
6

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

NSDictionary *infoPlistDict = [[NSBundle mainBundle] infoDictionary];
NSString *version = infoPlistDict[@"CFBundleVersion"];
svth
источник