iOS: acceda a las variables app-info.plist en el código


103

Estoy trabajando en una aplicación universal y me gustaría acceder a los valores almacenados en el archivo app-info.plist en mi código.

Razón: creo una instancia de un UIViewController dinámicamente desde un guión gráfico usando:

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

Ahora, tener el nombre del guión gráfico @ "MainStoryboard_iPhone" arriba es feo.

Quiero hacer algo como:

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

donde appInfo quizás puede ser un NSDictionary de todos los valores en app-info.plist

Respuestas:


253

Los atributos de info.plist para su proyecto son directamente accesibles por lo siguiente ...

[[NSBundle mainBundle] objectForInfoDictionaryKey:key_name];

Por ejemplo, para obtener el número de versión, puede hacer lo siguiente

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

Hay un problema en que el número de versión ahora tiene dos atributos en info.plist, pero ¿entiendes la idea? Si ve su info.plist como código fuente (haga clic con el botón derecho en info.plist - seleccione Abrir como), podrá ver todos los nombres de clave que puede usar.


5
Como lo menciona @Answerbot en esta publicación: stackoverflow.com/a/4059118/1210822 : "CFBundleVersion se ha reutilizado para ser Build y la versión es CFBundleShortVersionString", por lo que ahora para recuperar el número de versión de plist, necesitamos usar: NSString * version = [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleShortVersionString"];
sonoshin

para 11.3 no funciona, porque NSBundle fue renombrado y el nuevo Bundle aún no lo tiene incluido. ¿Tiene una actualización?
Yvonne Marggraf

Si tengo una aplicación Enterprise iOS que se distribuye a través de la web, ¿puedo agregar pares clave / valor en el archivo PLIST y luego leer esos valores de la aplicación en el momento de la descarga?
Brant

¿Cómo podemos actualizar el valor de CFBundleVersion desde AppDelegate.m?
pragnesh

26

Sintaxis Swift 4+ para la solución de Damo

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

Ejemplo

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

Para principiantes como yo, Bundlerequiereimport SystemConfiguration
GrafOrlov

12

Bueno, puedes acceder a info.plist muy fácilmente:

Obtener el nombre del guión gráfico:

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

No estoy seguro de si detectará si está en un iPad y debería usar la UIMainStoryboardFile~ipadclave instalada.


6
XCode rellena automáticamente la clave 'UIMainStoryboardFile' con los archivos de Storyboard de iPhone / iPad, según el dispositivo :)
Sherlock

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

También puede utilizar NSDictionary:NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
Darius Miliauskas

6

También puede utilizar el método infoDictionary en NSBundle:

NSDictionary *infoPlistDict = [[NSBundle mainBundle] infoDictionary];
NSString *version = infoPlistDict[@"CFBundleVersion"];
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.