iOS: Zugriff auf app-info.plist-Variablen im Code

102

Ich arbeite an einer Universal-App und möchte auf die Werte zugreifen, die in der Datei app-info.plist in meinem Code gespeichert sind.

Grund: Ich instanziiere einen UIViewController dynamisch aus einem Storyboard mit:

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

Jetzt ist es hässlich, den Storyboard-Namen @ "MainStoryboard_iPhone" oben zu haben.

Ich möchte so etwas tun wie:

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

Dabei kann appInfo möglicherweise ein NSDictionary aller Werte in app-info.plist sein

Sherlock
quelle

Antworten:

253

Auf Attribute aus der info.plist für Ihr Projekt können Sie wie folgt direkt zugreifen:

[[NSBundle mainBundle] objectForInfoDictionaryKey:key_name];

Um beispielsweise die Versionsnummer zu erhalten, gehen Sie wie folgt vor

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

Es gibt ein Problem, dass die Versionsnummer jetzt zwei Attribute in der info.plist hat - aber Sie haben die Idee? Wenn Sie Ihre info.plist als Quellcode anzeigen (klicken Sie mit der rechten Maustaste auf die info.plist - wählen Sie Öffnen als), werden alle verschiedenen Schlüsselnamen angezeigt, die Sie verwenden können.

Damo
quelle
5
Wie von @Answerbot in diesem Beitrag erwähnt: stackoverflow.com/a/4059118/1210822 : "CFBundleVersion wurde für Build und Version als CFBundleShortVersionString umfunktioniert". Zum Abrufen der Versionsnummer von plist müssen wir daher Folgendes verwenden: NSString * version = [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleShortVersionString"];
Sonoshin
für 11.3 funktioniert es nicht, da NSBundle umbenannt wurde und das neue Bundle es noch nicht enthält. Haben Sie ein Update?
Yvonne Marggraf
Wenn ich eine Enterprise iOS-App habe, die über das Internet verbreitet wird, kann ich der PLIST-Datei Schlüssel / Wert-Paare hinzufügen und diese Werte anschließend zum Zeitpunkt des Downloads aus der App lesen?
Brant
Wie können wir den Wert von CFBundleVersion über AppDelegate.m aktualisieren?
Pragnesh
26

Schnelle 4+ Syntax für Damos Lösung

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

Beispiel

let appVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion")
Einzelgänger
quelle
Für Anfänger wie mich ist Bundleerforderlichimport SystemConfiguration
GrafOrlov
12

Nun, Sie können ganz einfach auf die info.plist zugreifen:

Den Namen des Storyboards erhalten:

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

Ich bin mir nicht sicher, ob es UIMainStoryboardFile~ipaderkennt , ob es sich in einem iPad befindet, und es sollte den installierten Schlüssel verwenden.

rckoenes
quelle
6
XCode füllt den Schlüssel 'UIMainStoryboardFile' automatisch mit den iPhone / iPad Storyboard-Dateien, je nach Gerät :)
sherlock
8
NSString *path = [[NSBundle mainBundle] pathForResource: @"YOURPLISTNAME" ofType: @"plist"]; 
NSMutableDictionary *dictplist =[[NSMutableDictionary alloc] initWithContentsOfFile:path];
James Lobo
quelle
Sie können auch NSDictionary verwenden: NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
Darius Miliauskas
6

Sie können auch die infoDictionary-Methode in NSBundle verwenden:

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