iOS: accédez aux variables app-info.plist dans le code

103

Je travaille sur une application universelle et je souhaite accéder aux valeurs stockées dans le fichier app-info.plist dans mon code.

Raison: j'instancie un UIViewController dynamiquement à partir d'un storyboard en utilisant:

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

Maintenant, avoir le nom du storyboard @ "MainStoryboard_iPhone" ci-dessus est moche.

Je veux faire quelque chose comme:

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

où appInfo peut peut-être être un NSDictionary de toutes les valeurs dans app-info.plist

Sherlock
la source

Réponses:

253

Les attributs de info.plist pour votre projet sont directement accessibles par les éléments suivants ...

[[NSBundle mainBundle] objectForInfoDictionaryKey:key_name];

Par exemple, pour obtenir le numéro de version, vous pouvez effectuer les opérations suivantes

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

Il y a un piège en ce que le numéro de version a maintenant deux attributs dans le fichier info.plist - mais vous voyez l'idée? Si vous affichez votre info.plist en tant que code source (cliquez avec le bouton droit sur info.plist - sélectionnez Ouvrir en tant que), vous pourrez voir tous les différents noms de clés que vous pouvez utiliser.

Damo
la source
5
Comme mentionné par @Answerbot dans cet article: stackoverflow.com/a/4059118/1210822 : "CFBundleVersion a été réutilisé pour être Build et Version est CFBundleShortVersionString", donc maintenant pour récupérer le numéro de version de plist, nous devons utiliser: NSString * version = [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleShortVersionString"];
sonoshin
pour 11.3 cela ne fonctionne pas, car NSBundle a été renommé et le nouveau Bundle ne l'a pas encore inclus. Avez-vous une mise à jour?
Yvonne Marggraf du
Si j'ai une application Enterprise iOS distribuée via le Web, puis-je ajouter des paires clé / valeur dans le fichier PLIST, puis lire ces valeurs à partir de l'application au moment du téléchargement?
Brant
comment pouvons-nous mettre à jour la valeur de CFBundleVersion à partir de AppDelegate.m?
pragnesh le
27

Syntaxe Swift 4+ pour la solution Damo

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

Exemple

let appVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion")
Maverick
la source
Pour les débutants comme moi, Bundlenécessiteimport SystemConfiguration
GrafOrlov
12

Eh bien, vous pouvez accéder très facilement à info.plist:

Obtenir le nom du storyboard:

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

Je ne sais pas s'il détectera s'il se trouve dans un iPad et il devrait utiliser la UIMainStoryboardFile~ipadclé installée.

rckoenes
la source
6
XCode remplit automatiquement la clé 'UIMainStoryboardFile' avec les fichiers Storyboard iPhone / iPad, en fonction de l'appareil :)
Sherlock
8
NSString *path = [[NSBundle mainBundle] pathForResource: @"YOURPLISTNAME" ofType: @"plist"]; 
NSMutableDictionary *dictplist =[[NSMutableDictionary alloc] initWithContentsOfFile:path];
James Lobo
la source
Vous pouvez également utiliser NSDictionary:NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
Darius Miliauskas
6

Vous pouvez également utiliser la méthode infoDictionary sur NSBundle:

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