NSBundle bundleWithIdentifier, возвращающий null для статической структуры и пакета ресурсов

Я пытаюсь создать статическую структуру, которая будет использовать некоторые изображения для отображения в своем представлении. Я создал MyFrameworkBundle.bundle из XCode, добавив цель в свой проект SDK. Добавил все мои изображения в пакет, создал пакет и дал этой цели идентификатор пакета my.frameworkbundle. Теперь я пытаюсь получить этот пакет в своей структуре следующим образом:

NSBundle * mybundleRef = [NSBundle bundleWithIdentifier:@"my.frameworkbundle"];

Затем я поместил эти рамки и пакет ресурсов в другой проект и попытался запустить функцию с помощью строки выше. Он всегда возвращает ноль. Даже если я попытаюсь получить структуру, как приведенный выше код, т.е.:

NSBundle * mybundleRef = [NSBundle bundleWithIdentifier:@"my.framework"];

Это также дало мне ноль. Но если я меняю этот фреймворк со статического на динамический, он всегда дает мне правильный пакет. Поскольку я собираюсь использовать его с Unity, я не хочу, чтобы динамическая структура избегала сценария постобработки.

Я также пробовал следующий код:

NSString *bundleString =[[NSBundle mainBundle] pathForResource:@"MyFrameworkBundle" ofType:@"bundle"];
NSBundle * PlayCacheBundle = [NSBundle bundleWithPath:bundleString];

но выдает ошибку

подходящее изображение не найдено

Детали системы:

  • Xкод: 8.2.1
  • MacOS: 10.12 (Сьерра)

person Anas iqbal    schedule 02.03.2017    source источник


Ответы (2)


Статические библиотеки — это просто компиляции объектных файлов (несколько файлов .o в одном файле .a). Их личность исчезает, когда они связаны с исполняемой целью (бинарным приложением или динамической библиотекой), и они не приносят никаких ресурсов, кроме кода и постоянных данных.

person shallowThought    schedule 02.07.2018
comment
Я думаю, что вопрос был о фреймворке, а не о статической библиотеке. - person David Chelidze; 28.05.2019

Поскольку фреймворк статически связан, кажется, что классы принадлежат основному пакету, поэтому +[NSBundle bundleForClass:] не работает.

Вы можете создать свой собственный пакет, указывающий на фреймворк, используя следующее:

NSString *fwPath = [[[NSBundle mainBundle] privateFrameworksPath] stringByAppendingPathComponent:@"Shared.framework"]; NSBundle *bundle = [NSBundle bundleWithPath:fwPath];

Я тестировал пустой проект, он работает и позволяет загружать файлы NIB. Я не проверял каталоги активов, но подозреваю, что, поскольку это действительная ссылка NSBundle, у вас все должно быть в порядке.

person dvkch    schedule 02.07.2018