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可能是app-info.plist中所有值的NSDictionary

Answers:


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已重新用于构建,版本是CFBundleShortVersionString”,因此现在要从plist检索版本号,我们需要使用:NSString *版本= [[NSBundle mainBundle] objectForInfoDictionaryKey:@“ CFBundleShortVersionString”];
sonoshin 2012年

对于11.3,它不起作用,因为NSBundle被重命名并且新的Bundle还没有包含它。您有更新吗?
伊冯·玛格格拉夫

如果我有一个通过网络发布的Enterprise iOS应用程序,是否可以在PLIST文件中添加键/值对,然后在下载时从应用程序中读取这些值?
布兰特

我们如何从AppDelegate.m更新CFBundleVersion的值?
pragnesh

26

适用于Damo解决方案的Swift 4+语法

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

let appVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion")

对于像我这样的初学者,Bundle需要import SystemConfiguration
GrafOrlov

12

好吧,您可以非常轻松地访问info.plist:

获取情节提要的名称:

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

不知道是否会检测它是否在iPad中,并且应该使用UIMainStoryboardFile~ipad设置的密钥。


6
XCode会根据设备自动使用iPhone / iPad Storyboard文件填充键“ UIMainStoryboardFile” :)
2012年

8
NSString *path = [[NSBundle mainBundle] pathForResource: @"YOURPLISTNAME" ofType: @"plist"]; 
NSMutableDictionary *dictplist =[[NSMutableDictionary alloc] initWithContentsOfFile:path];

您还可以使用NSDictionary:NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
Darius Miliauskas 2015年

6

您还可以在NSBundle上使用infoDictionary方法:

NSDictionary *infoPlistDict = [[NSBundle mainBundle] infoDictionary];
NSString *version = infoPlistDict[@"CFBundleVersion"];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.