iOS: accedi alle variabili app-info.plist nel codice


103

Sto lavorando su un'app universale e vorrei accedere ai valori memorizzati nel file app-info.plist nel mio codice.

Motivo: istanzio un UIViewController dinamicamente da uno storyboard utilizzando:

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

Ora, avere il nome dello storyboard @ "MainStoryboard_iPhone" sopra è brutto.

Voglio fare qualcosa come:

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

dove appInfo può forse essere un NSDictionary di tutti i valori in app-info.plist

Risposte:


253

Gli attributi dal file info.plist per il tuo progetto sono direttamente accessibili dal seguente ...

[[NSBundle mainBundle] objectForInfoDictionaryKey:key_name];

Ad esempio, per ottenere il numero di versione potresti fare quanto segue

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

C'è un problema nel fatto che il numero di versione ora ha due attributi in info.plist, ma hai capito? Se visualizzi il tuo info.plist come codice sorgente (fai clic con il pulsante destro del mouse su info.plist - seleziona Apri come), vedrai tutti i vari nomi di chiavi che puoi utilizzare.


5
Come già detto da @Answerbot in questo post: stackoverflow.com/a/4059118/1210822 : "CFBundleVersion è stato riproposto per essere build e la versione è CFBundleShortVersionString", così ora per recuperare il numero di versione da plist, abbiamo bisogno di usare: NSString * versione = [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleShortVersionString"];
sonoshin

per 11.3 non funziona, perché NSBundle è stato rinominato e il nuovo Bundle non lo ha ancora incluso. Hai un aggiornamento?
Yvonne Marggraf

Se ho un'app iOS aziendale distribuita tramite Web, posso aggiungere coppie chiave / valore nel file PLIST e successivamente leggere quei valori dall'app al momento del download?
Brant

come possiamo aggiornare il valore di CFBundleVersion da AppDelegate.m?
pragnesh

26

Sintassi Swift 4+ per la soluzione di Damo

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

Esempio

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

Per i principianti come me, Bundlerichiedeimport SystemConfiguration
GrafOrlov

12

Bene, puoi accedere a info.plist molto facilmente:

Ottenere il nome dello storyboard:

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

Non sono sicuro che rileverà se è in un iPad e dovrebbe utilizzare la UIMainStoryboardFile~ipadchiave installata.


6
XCode popola automaticamente la chiave 'UIMainStoryboardFile' con i file Storyboard di iPhone / iPad, a seconda del dispositivo :)
Sherlock

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

Puoi anche usare NSDictionary:NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
Darius Miliauskas

6

Puoi anche utilizzare il metodo infoDictionary su NSBundle:

NSDictionary *infoPlistDict = [[NSBundle mainBundle] infoDictionary];
NSString *version = infoPlistDict[@"CFBundleVersion"];
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.