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.