NSBundle, plist и другие ресурсы в Статической библиотеке Obj-c
Я создал статическую библиотеку в Xcode, которую я могу успешно использовать в других проектах. Тем не менее, с такими ресурсами, как plists, я считаю, что я должен включать любые плиты, упомянутые в моей библиотеке в основном проекте, в котором используется проект.
В моем проекте статической библиотеки у меня есть мой plist, включенный в фазу "Копирование ресурсов Bundle" цели. В моем коде, вот что я делаю:
NSBundle *mainBundle = [NSBundle mainBundle];
NSString *filePath = [mainBundle pathForResource:@"MyClassParams" ofType:@"plist"];
NSMutableDictionary* params = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];
Если я использую mainBundle, а MyClassParams.plist включен в основной проект, все это хорошо. Если MyClassParams.plist включен в проект библиотеки, он не работает.
В предположении, что [NSBundle mainBundle] ссылался на неправильный статический метод для использования, я заменил его на:
NSBundle *mainBundle = [NSBundle bundleForClass:[MyClass class]];
Это тоже не сработало.
Итак, можно ли включить plist или любые другие ресурсы со статической библиотекой - или мне нужно включить все, что мне нужно в проекте, где используется lib?
Ответы
Ответ 1
Статические библиотеки не находятся в связках, когда они связаны в приложении, они являются частью этого пакета приложений. На iPhone, фактически весь написанный вами код будет в mainBundle, так как вы не можете включить встроенные фреймворки.
Итак, да, вам нужно скопировать все ресурсы в проект, с которым вы связываете статическую структуру.
Ответ 2
Я знаю, что вы не можете включать файлы ресурсов в статическую библиотеку (что делают рамки).
Я использую другое решение в своих проектах:
Внутри проекта статической библиотеки "YYY":
- Я добавляю цель "Loadable Bundle" в мой проект статической библиотеки (Add Target, Cocoa, Loadable Bundle)
- Я добавляю эту цель в зависимость от цели статической библиотеки
Внутри основного проекта:
- Свяжите
libYYY.a
- Добавить пакет
YYY.bundle
в скопированные файлы ресурсов
Таким образом, файлы ресурсов, используемые в статической библиотеке, не управляются в основном проекте. Скажем, у меня есть изображение foo.png
в статической библиотеке, я использую
[UIImage imageNamed:@"YYY.bundle/foo.png"]
Затем вы можете получить свой plist следующим образом:
NSBundle *staticLibBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"YYY" ofType:@"bundle"]];
NSString *filePath = [staticLibBundle pathForResource:@"MyClassParams" ofType:@"plist"];
NSMutableDictionary *params = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];
Ниже, два скриншота:
- left: статический проект библиотеки с загружаемой целью пакета
- справа: отображение бинарного файла статической библиотеки, добавленного в "Link Binary With Libraries", и набор ресурсов, добавленный в "Копировать ресурсы пакета".
![Static library project]()
![Main project]()
Ответ 3
Я следил за всем, что предлагал @Jilouc, однако я могу получить пакет, но не смог получить файлы внутри него. Я пробовал оба пути (@"yyy.bundle/image"
или staticlib pathforresource...
)
Затем я использовал метод ниже, и он сработает!
NSBundle *staticBundle = [NSBundle bundleWithPath:[[[NSBundle mainBundle]resourcePath] stringByAppendingPathComponent:@"yy.bundle"]];
NSString *filePath = [[jsBundle resourcePath]stringByAppendingPathComponent:fileName];
NSString* content = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:NULL];