iOS: acesse as variáveis ​​app-info.plist no código

103

Estou trabalhando em um aplicativo Universal e gostaria de acessar os valores armazenados no arquivo app-info.plist em meu código.

Motivo: Eu instanciao um UIViewController dinamicamente a partir de um storyboard usando:

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

Agora, ter o nome do storyboard @ "MainStoryboard_iPhone" acima é feio.

Eu quero fazer algo como:

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

onde appInfo pode ser um NSDictionary de todos os valores em app-info.plist

Sherlock
fonte

Respostas:

253

Os atributos do info.plist para o seu projeto podem ser acessados ​​diretamente através do seguinte ...

[[NSBundle mainBundle] objectForInfoDictionaryKey:key_name];

Por exemplo, para obter o número da versão, você pode fazer o seguinte

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

Existe um problema no fato de que o número da versão agora tem dois atributos no info.plist - mas você entendeu? Se você visualizar seu info.plist como código-fonte (clique com o botão direito do mouse em info.plist - selecione Abrir como), você verá todos os vários nomes de chave que pode usar.

Damo
fonte
5
Conforme mencionado por @Answerbot neste post: stackoverflow.com/a/4059118/1210822 : "CFBundleVersion foi reaproveitado para ser Build e Version é CFBundleShortVersionString", então agora para recuperar o número da versão de plist, precisamos usar: NSString * version = [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleShortVersionString"];
sonoshin
para 11.3 não funciona, porque NSBundle foi renomeado e o novo Bundle ainda não o incluiu. Você tem uma atualização?
Yvonne Marggraf de
Se eu tiver um aplicativo Enterprise iOS distribuído pela web, posso adicionar pares de chave / valor no arquivo PLIST e, posteriormente, ler esses valores do aplicativo no momento do download?
Brant
como podemos atualizar o valor de CFBundleVersion do AppDelegate.m?
pragnesh
26

Sintaxe do Swift 4+ para a solução da Damo

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

Exemplo

let appVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion")
Maverick
fonte
Para iniciantes como eu, Bundlerequerimport SystemConfiguration
GrafOrlov
12

Bem, você pode acessar o info.plist facilmente:

Obtendo o nome do storyboard:

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

Não tenho certeza se ele detectará se está em um iPad e deve usar a UIMainStoryboardFile~ipadchave instalada.

rckoenes
fonte
6
O XCode preenche automaticamente a chave 'UIMainStoryboardFile' com os arquivos do Storyboard do iPhone / iPad, dependendo do dispositivo :)
sherlock
8
NSString *path = [[NSBundle mainBundle] pathForResource: @"YOURPLISTNAME" ofType: @"plist"]; 
NSMutableDictionary *dictplist =[[NSMutableDictionary alloc] initWithContentsOfFile:path];
James Lobo
fonte
Você também pode usar NSDictionary:NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
Darius Miliauskas,
6

Você também pode usar o método infoDictionary em NSBundle:

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