iOS: Truy cập các biến app-info.plist trong mã


103

Tôi đang làm việc trên ứng dụng Toàn cầu và muốn truy cập các giá trị được lưu trữ trong tệp app-info.plist trong mã của tôi.

Lý do: Tôi khởi tạo động UIViewController từ bảng phân cảnh bằng cách sử dụng:

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

Bây giờ, có tên bảng phân cảnh @ "MainStoryboard_iPhone" ở trên là xấu.

Tôi muốn làm điều gì đó như:

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

nơi appInfo có thể là NSDictionary của tất cả các giá trị trong app-info.plist

Câu trả lời:


253

Các thuộc tính từ info.plist cho dự án của bạn có thể truy cập trực tiếp bằng cách sau ...

[[NSBundle mainBundle] objectForInfoDictionaryKey:key_name];

Ví dụ: để lấy số phiên bản, bạn có thể làm như sau

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

Có một điểm đáng chú ý là số phiên bản hiện có hai thuộc tính trong info.plist - nhưng bạn hiểu không? Nếu bạn xem info.plist của mình dưới dạng mã nguồn (nhấp chuột phải vào info.plist - chọn Open As) thì bạn sẽ thấy tất cả các tên khóa khác nhau mà bạn có thể sử dụng.


5
Như đã đề cập bởi @Answerbot trong bài đăng này: stackoverflow.com/a/4059118/1210822 : "CFBundleVersion đã được thay thế để trở thành Bản dựng và Phiên bản là CFBundleShortVersionString", vì vậy, bây giờ để lấy số phiên bản từ plist, chúng ta cần sử dụng: NSString * version = [[NSBundle mainBundle] objectForInfoDictionaryKey: @ "CFBundleShortVersionString"];
sonoshin

đối với 11.3 nó không hoạt động, vì NSBundle đã được đổi tên và Gói mới chưa bao gồm nó. Bạn có cập nhật không?
Yvonne Marggraf

Nếu tôi có ứng dụng Enterprise iOS được phân phối qua web, tôi có thể thêm các cặp khóa / giá trị vào tệp PLIST và sau đó đọc các giá trị đó từ ứng dụng tại thời điểm tải xuống không?
Brant

làm cách nào chúng ta có thể cập nhật giá trị của CFBundleVersion từ AppDelegate.m?
pragnesh

26

Cú pháp Swift 4+ cho giải pháp của Damo

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

Thí dụ

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

Đối với người mới bắt đầu như tôi, Bundleđòi hỏiimport SystemConfiguration
GrafOrlov

12

Vâng, bạn có thể truy cập info.plist rất dễ dàng:

Lấy tên của bảng phân cảnh:

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

Không chắc chắn rằng nó sẽ phát hiện ra nó có trong iPad hay không và nó sẽ sử dụng UIMainStoryboardFile~ipadchìa khóa được cài sẵn.


6
XCode tự động populates phím 'UIMainStoryboardFile' với các tập tin iPhone / iPad Storyboard, tùy thuộc vào thiết bị :)
sherlock

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

Bạn cũng có thể sử dụng NSDictionary:NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];
Darius Miliauskas

6

Bạn cũng có thể sử dụng phương thức infoDictionary trên NSBundle:

NSDictionary *infoPlistDict = [[NSBundle mainBundle] infoDictionary];
NSString *version = infoPlistDict[@"CFBundleVersion"];
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.