iOS: เข้าถึงตัวแปร app-info.plist ในโค้ด


103

ฉันกำลังทำงานกับแอปสากลและต้องการเข้าถึงค่าที่เก็บไว้ในไฟล์ app-info.plist ในรหัสของฉัน

เหตุผล: ฉันสร้างอินสแตนซ์ UIViewController แบบไดนามิกจากสตอรี่บอร์ดโดยใช้:

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

ตอนนี้การมีชื่อสตอรี่บอร์ด @ "MainStoryboard_iPhone" ข้างบนนั้นน่าเกลียด

ฉันต้องการทำสิ่งที่ชอบ:

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

โดยที่ appInfo อาจเป็น NSDictionary ของค่าทั้งหมดใน app-info.plist

คำตอบ:


253

แอตทริบิวต์จาก info.plist สำหรับโครงการของคุณสามารถเข้าถึงได้โดยตรงดังต่อไปนี้ ...

[[NSBundle mainBundle] objectForInfoDictionaryKey:key_name];

ตัวอย่างเช่นเพื่อรับหมายเลขเวอร์ชันคุณอาจทำสิ่งต่อไปนี้

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

มี gotcha ที่หมายเลขเวอร์ชันตอนนี้มีสองแอตทริบิวต์ใน info.plist - แต่คุณเข้าใจหรือไม่? หากคุณดู info.plist ของคุณเป็นซอร์สโค้ด (คลิกขวาที่ info.plist - เลือก Open As) คุณจะเห็นชื่อคีย์ต่างๆทั้งหมดที่คุณสามารถใช้ได้


5
ตามที่ @Answerbot กล่าวไว้ในโพสต์นี้: stackoverflow.com/a/4059118/1210822 : "CFBundleVersion ถูกนำมาใช้ใหม่ให้เป็น Build และเวอร์ชันคือ CFBundleShortVersionString" ดังนั้นในการดึงหมายเลขเวอร์ชันจาก plist เราต้องใช้ NSString * version = [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleShortVersionString"];
sonoshin

สำหรับ 11.3 ใช้ไม่ได้เนื่องจาก NSBundle ถูกเปลี่ยนชื่อและ Bundle ใหม่ยังไม่รวมอยู่ คุณมีการอัปเดตหรือไม่?
Yvonne Marggraf

หากฉันมีแอป Enterprise iOS ที่เผยแพร่ผ่านเว็บฉันสามารถเพิ่มคู่คีย์ / ค่าในไฟล์ PLIST จากนั้นอ่านค่าเหล่านั้นจากแอปเมื่อดาวน์โหลดได้หรือไม่
Brant

เราจะอัพเดตมูลค่า CFBundleVersion จาก AppDelegate.m ได้อย่างไร?
pragnesh


12

คุณสามารถเข้าถึง info.plist ได้อย่างง่ายดาย:

การตั้งชื่อสตอรี่บอร์ด:

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

ไม่แน่ใจว่าจะตรวจจับได้ว่าอยู่ใน iPad หรือไม่และควรใช้UIMainStoryboardFile~ipadคีย์ที่ติดตั้งไว้


6
XCode จะเติมคีย์ 'UIMainStoryboardFile' โดยอัตโนมัติด้วยไฟล์สตอรี่บอร์ดของ iPhone / iPad ขึ้นอยู่กับอุปกรณ์ :)
sherlock

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

คุณยังสามารถใช้ NSDictionary:NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
Darius Miliauskas

6

คุณยังสามารถใช้เมธอด infoDictionary บน NSBundle:

NSDictionary *infoPlistDict = [[NSBundle mainBundle] infoDictionary];
NSString *version = infoPlistDict[@"CFBundleVersion"];
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.