iOS: Koddaki app-info.plist değişkenlerine erişin


103

Bir Universal uygulaması üzerinde çalışıyorum ve kodumdaki app-info.plist dosyasında depolanan değerlere erişmek istiyorum.

Sebep: Bir UIViewController'ı aşağıdakileri kullanarak bir storyboard'dan dinamik olarak başlatıyorum:

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

Şimdi, yukarıda @ "MainStoryboard_iPhone" film şeridi adına sahip olmak çirkin.

Şunun gibi bir şey yapmak istiyorum:

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

appInfo, belki de app-info.plist'teki tüm değerlerin NSDictionary olabilir

Yanıtlar:


253

Projeniz için info.plist'teki özniteliklere aşağıdaki yollarla doğrudan erişilebilir ...

[[NSBundle mainBundle] objectForInfoDictionaryKey:key_name];

Örneğin sürüm numarasını almak için aşağıdakileri yapabilirsiniz

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

Info.plist'te sürüm numarasının artık iki özniteliğe sahip olduğu konusunda bir sorun var - ama fikri anladınız mı? Eğer info.plist'inizi kaynak kodu olarak görüntülerseniz (info.plist'i sağ tıklayın - Farklı Aç'ı seçin), o zaman kullanabileceğiniz çeşitli anahtar isimlerini göreceksiniz.


5
Bu gönderide @Answerbot tarafından belirtildiği gibi: stackoverflow.com/a/4059118/1210822 : "CFBundleVersion, Build olarak yeniden tasarlandı ve Sürüm, CFBundleShortVersionString", bu nedenle şimdi sürüm numarasını plist'ten almak için kullanmamız gereken: NSString * version = [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleShortVersionString"];
sonoshin

11.3 için işe yaramıyor çünkü NSBundle yeniden adlandırıldı ve yeni Bundle'da henüz dahil edilmedi. Güncellemeniz var mı?
Yvonne Marggraf

Web üzerinden dağıtılan bir Kurumsal iOS uygulamam varsa, PLIST dosyasına anahtar / değer çiftleri ekleyebilir ve daha sonra indirme sırasında bu değerleri uygulamadan okuyabilir miyim?
Brant

CFBundleVersion değerini AppDelegate.m'den nasıl güncelleyebiliriz?
pragnesh

27

Damo'nun çözümü için Swift 4+ sözdizimi

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

Misal

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

Benim gibi yeni başlayanlar için Bundlegerekliimport SystemConfiguration
GrafOrlov

12

Pekala, info.plist'e çok kolay erişebilirsiniz:

Film şeridinin adını almak:

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

Bir iPad'de olup olmadığını tespit edip edemeyeceğinden ve verilen UIMainStoryboardFile~ipadanahtarı kullanması gerektiğinden emin değilim .


6
XCode, cihaza bağlı olarak 'UIMainStoryboardFile' anahtarını iPhone / iPad Storyboard dosyalarıyla otomatik olarak doldurur :)
sherlock

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

NSDictionary de kullanabilirsiniz:NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
Darius Miliauskas

6

NSBundle'da infoDictionary yöntemini de kullanabilirsiniz:

NSDictionary *infoPlistDict = [[NSBundle mainBundle] infoDictionary];
NSString *version = infoPlistDict[@"CFBundleVersion"];
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.