NSBundle, plist и другие ресурсы в Obj-c Static Library - PullRequest
19 голосов
/ 01 ноября 2009

Я создал статическую библиотеку в XCode, которую я могу успешно использовать в других проектах. Однако с такими ресурсами, как plists, я считаю, что я должен включить любые plists, на которые есть ссылки в моей библиотеке, в основной проект, где используется проект.

В моем проекте статической библиотеки мой plist включен в фазу "Копировать ресурсы комплекта" цели. В моем коде вот что я делаю:

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 или любые другие ресурсы в статическую библиотеку - или мне нужно включить все, что мне нужно, в проект, где используется библиотека?

Ответы [ 3 ]

18 голосов
/ 02 ноября 2009

Статические библиотеки не входят в пакеты, и когда они связываются с приложением, они становятся частью этого пакета приложений. На iPhone фактически весь код, который вы пишете, будет в mainBundle, поскольку вы не можете включать встроенные фреймворки.

Так что да, вам нужно скопировать все ресурсы в проект, в который вы связываете статическую платформу.

12 голосов
/ 27 декабря 2010

Я знаю, что вы не можете включать файлы ресурсов в статическую библиотеку (это то, что делают фреймворки). Я использую другое решение в своих проектах:

Внутри статической библиотеки проекта "ГГГГ":

  • Я добавляю цель «Загружаемый пакет» в мой проект статической библиотеки (Добавить цель, Какао, Загружаемый пакет)
  • Я добавляю эту цель как зависимость от статической библиотеки цели

Внутри основного проекта:

  • Ссылка libYYY.a
  • Добавить пакет YYY.bundle к скопированным файлам ресурсов

Таким образом, файлы ресурсов, используемые в статической библиотеке, не управляются в основном проекте. Скажем, у меня есть foo.png картинка в статической библиотеке, я использую

[UIImage imageNamed:@"YYY.bundle/foo.png"]

Вы могли бы тогда получить свой список следующим образом:

NSBundle *staticLibBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"YYY" ofType:@"bundle"]];
NSString *filePath   = [staticLibBundle pathForResource:@"MyClassParams" ofType:@"plist"];

NSMutableDictionary *params = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];

Ниже, два скриншота:

  • left : проект статической библиотеки с целевым загружаемым комплектом
  • вправо : отображение двоичного файла статической библиотеки, добавленного в «Связать двоичный файл с библиотеками», и комплект ресурсов, добавленный в «Копирование ресурсов комплекта».

Static library project Main project

2 голосов
/ 23 июля 2011

Я следовал всему, что предложил @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];
...