iOS: dostęp do zmiennych app-info.plist w kodzie

103

Pracuję nad aplikacją Universal i chciałbym uzyskać dostęp do wartości przechowywanych w pliku app-info.plist w moim kodzie.

Powód: dynamicznie tworzę wystąpienie UIViewController z serii ujęć przy użyciu:

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

Posiadanie nazwy storyboardu @ "MainStoryboard_iPhone" powyżej jest brzydkie.

Chcę zrobić coś takiego:

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

gdzie appInfo może być NSDictionary wszystkich wartości w app-info.plist

Sherlock
źródło

Odpowiedzi:

253

Atrybuty z info.plist dla twojego projektu są bezpośrednio dostępne przez następujące ...

[[NSBundle mainBundle] objectForInfoDictionaryKey:key_name];

Na przykład, aby uzyskać numer wersji, możesz wykonać następujące czynności

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

Problem polega na tym, że numer wersji ma teraz dwa atrybuty w info.plist - ale rozumiesz, o co chodzi? Jeśli wyświetlisz info.plist jako kod źródłowy (kliknij prawym przyciskiem myszy info.plist - wybierz Otwórz jako), zobaczysz wszystkie różne nazwy kluczy, których możesz użyć.

Damo
źródło
5
Jak wspomniał @Answerbot w tym poście: stackoverflow.com/a/4059118/1210822 : „CFBundleVersion został zmieniony na Build, a Version is CFBundleShortVersionString”, więc teraz, aby pobrać numer wersji z plist, musimy użyć: NSString * version = [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleShortVersionString"];
sonoshin
w wersji 11.3 nie działa, ponieważ nazwa NSBundle została zmieniona, a nowy pakiet nie ma go jeszcze w zestawie. Czy masz aktualizację?
Yvonne Marggraf
Jeśli mam aplikację Enterprise iOS, która jest rozpowszechniana przez Internet, czy mogę dodać pary klucz / wartość w pliku PLIST, a następnie odczytać te wartości z aplikacji w momencie pobierania?
Brant
jak możemy zaktualizować wartość CFBundleVersion z AppDelegate.m?
pragnesh
27

Szybka składnia 4+ dla rozwiązania Damo

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

Przykład

let appVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion")
Politycznie niezależny
źródło
Dla początkujących, takich jak ja, Bundlewymagaimport SystemConfiguration
GrafOrlov
12

Cóż, możesz bardzo łatwo uzyskać dostęp do info.plist:

Pobieranie nazwy storyboardu:

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

Nie jestem pewien, czy wykryje, czy jest w iPadzie, i powinien użyć umieszczonego UIMainStoryboardFile~ipadklucza.

rckoenes
źródło
6
XCode automatycznie wypełnia klucz 'UIMainStoryboardFile' plikami iPhone / iPad Storyboard, w zależności od urządzenia :)
sherlock
8
NSString *path = [[NSBundle mainBundle] pathForResource: @"YOURPLISTNAME" ofType: @"plist"]; 
NSMutableDictionary *dictplist =[[NSMutableDictionary alloc] initWithContentsOfFile:path];
James Lobo
źródło
Możesz też użyć NSDictionary:NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
Darius Miliauskas
6

Możesz również użyć metody infoDictionary w NSBundle:

NSDictionary *infoPlistDict = [[NSBundle mainBundle] infoDictionary];
NSString *version = infoPlistDict[@"CFBundleVersion"];
svth
źródło