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

Sherlock
fuente

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.

Damo
fuente
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")
Disidente
fuente
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.

rckoenes
fuente
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];
James Lobo
fuente
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"];
svth
fuente