iOS: Mengakses variabel app-info.plist dalam kode

103

Saya sedang mengerjakan aplikasi Universal & ingin mengakses nilai yang disimpan dalam file app-info.plist dalam kode saya.

Alasan: Saya membuat instance UIViewController secara dinamis dari storyboard menggunakan:

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

Sekarang, memiliki nama storyboard @ "MainStoryboard_iPhone" di atas itu jelek.

Saya ingin melakukan sesuatu seperti:

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

di mana appInfo mungkin bisa menjadi NSDictionary dari semua nilai di app-info.plist

Sherlock
sumber

Jawaban:

253

Atribut dari info.plist untuk proyek Anda dapat langsung diakses oleh berikut ini ...

[[NSBundle mainBundle] objectForInfoDictionaryKey:key_name];

Misalnya untuk mendapatkan nomor versi Anda dapat melakukan hal berikut

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

Ada gotcha di mana nomor versi sekarang memiliki dua atribut di info.plist - tetapi Anda mengerti? Jika Anda melihat info.plist Anda sebagai kode sumber (klik kanan info.plist - pilih Open As) maka Anda akan melihat semua nama kunci yang dapat Anda gunakan.

Damo
sumber
5
Seperti yang disebutkan oleh @Answerbot dalam posting ini: stackoverflow.com/a/4059118/1210822 : "CFBundleVersion telah diubah fungsinya menjadi Build dan Version adalah CFBundleShortVersionString", jadi sekarang untuk mengambil nomor versi dari plist, kita perlu menggunakan: NSString * versi = [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleShortVersionString"];
sonoshin
untuk 11.3 tidak berfungsi, karena NSBundle telah diganti namanya dan Bundle baru belum menyertakannya. Apakah Anda memiliki Pembaruan?
Yvonne Marggraf
Jika saya memiliki aplikasi iOS Perusahaan yang didistribusikan melalui web, dapatkah saya menambahkan pasangan kunci / nilai di file PLIST, dan kemudian membaca nilai tersebut dari aplikasi pada saat mengunduh?
Brant
bagaimana kita dapat memperbarui nilai CFBundleVersion dari AppDelegate.m?
pragnesh
26

Sintaks cepat 4+ untuk solusi Damo

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

Contoh

let appVersion = Bundle.main.object(forInfoDictionaryKey: "CFBundleVersion")
Maverick
sumber
Untuk pemula seperti saya, Bundlemembutuhkanimport SystemConfiguration
GrafOrlov
12

Anda dapat mengakses info.plist dengan sangat mudah:

Mendapatkan nama papan cerita:

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

Tidak yakin apakah itu akan mendeteksi apakah itu di iPad dan itu harus menggunakan UIMainStoryboardFile~ipadkunci yang dipasang.

rckoenes
sumber
6
XCode secara otomatis mengisi kunci 'UIMainStoryboardFile' dengan file Storyboard iPhone / iPad, tergantung pada perangkatnya :)
sherlock
8
NSString *path = [[NSBundle mainBundle] pathForResource: @"YOURPLISTNAME" ofType: @"plist"]; 
NSMutableDictionary *dictplist =[[NSMutableDictionary alloc] initWithContentsOfFile:path];
James Lobo
sumber
Anda juga dapat menggunakan NSDictionary:NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
Darius Miliauskas
6

Anda juga dapat menggunakan metode infoDictionary di NSBundle:

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