Подтвердить что ты не робот

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?

4b9b3361

Ответ 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 projectMain 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];