IOS Static Framework с ресурсами внутри

Я пытаюсь создать фреймворк, в котором хранится некоторый общий код, который я использую в своих проектах. Я нашел онлайн-учебники и сумел создать фреймворк, но у меня все еще есть одна проблема, связанная с ресурсами (XIB, изображения и т. Д.).

Допустим, у меня естьMainViewController.xib который имеетUIImageView используяtest.png, Все это в моем пакете.

Когда я использую фреймворк в другом проекте, я добавляю его в раздел «Копировать ресурсы комплекта». фаза сборки. Проблема в том, что XIB доступен только с помощью пути, какdummy.framework/Resources/MainViewController.xib иUIImageView внутри не может загрузитьtest.png.

Похоже, что UIImageView попытается загрузить png из корня пакета, а не из соответствующей папки, где также хранится xib.

Кому-нибудь удалось создать фреймворк с кодом и ресурсами и использовать его в другом проекте?

 Apple07 апр. 2015 г., 08:50
Привет, Андрей, подскажите, пожалуйста, как вы добавляете файл .bundle в каталог фреймворков ... Я не могу этого сделать. в моем сценарии оболочки может быть какая-то ошибка.

Ответы на вопрос(7)

Чтобы загрузить изображение из динамического каркаса вSwift 3:

UIImage(named: "name", in: Bundle(for: type(of: self)), compatibleWith: nil)

 05 окт. 2018 г., 09:19
Работает отлично. Каков был мой сценарий, я использовал свою пользовательскую среду с активами, но не смог использовать изображения ресурсов. Но это сработало для меня
Решение Вопроса

Короткий ответ: вы не можете.

Когда вы компилируете приложение, пакет генерируется с использованием ресурсов & quot; main & quot; проект, игнорируя ресурсы в связанных рамках. Это включает в себя изображения, xib, plist и т. Д. (Все, что не является исходным файлом)

Что вам нужно сделать, так это добавить эти ресурсы в ваш основной проект, чтобы они были доступны для использования внутри вашего приложения, причем не самым удачным образом, но это сработает.

 Andrei Stanescu29 авг. 2012 г., 16:53
Ну, ресурсы скопированы, но в подпапке.
 Andrei Stanescu03 сент. 2012 г., 17:45
Это самый близкий ответ к реальным фактам. Однако вы можете заставить xcode копировать ресурсы из фреймворка, но они будут помещены в подпапку в основном комплекте. Это делает загрузку их болью в задницу.
 28 апр. 2016 г., 16:48
@doozMen Хотите объяснить, как?
 16 мар. 2016 г., 10:11
Вы можете сделать это сейчас

Я больше не управляю фреймворками вручную, но использую ирекомендую CocoaPods вместо.

Original answer:

Use the fake framework @wattson12 mentioned. It will compile and save the resources as well.

Inspired by this script, add this to your target to copy the resources to your app:

SOURCE_PATH="${TARGET_BUILD_DIR}/MYFramework.framework/Resources/"
TARGET_PATH="${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/MYFrameworkResources.bundle"
mkdir -p $TARGET_PATH
cp -R $SOURCE_PATH $TARGET_PATH

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

Edit

Чтобы использовать эти ресурсы из IB, например, файл png, замените:

MyImage

от:

MYFrameworkResources.bundle/MyImage.png

Он будет предварительно просматривать значок разбитого изображения, но будет работать при запуске.

Загрузите перо из кода:

[NSBundle loadNibNamed:@"MYFrameworkResources.bundle/MyNib" ...

Наконец, вы можете добавить эти методы в категорию NSBundle, чтобы упростить доступ к ресурсам Nib, которые могут быть в вашем основном комплекте или в MYFrameworkResources.bundle:

@implementation NSBundle (MyCategory)

+ (NSString *)pathForResource:(NSString *)name
                       ofType:(NSString *)extension
{
   , // First try with the main bundle
    NSBundle * mainBundle = [NSBundle mainBundle];
    NSString * path = [mainBundle pathForResource:name
                                           ofType:extension];
    if (path)
    {
        return path;
    }

    // Otherwise try with other bundles
    NSBundle * bundle;
    for (NSString * bundlePath in [mainBundle pathsForResourcesOfType:@"bundle"
                                                          inDirectory:nil])
    {
        bundle = [NSBundle bundleWithPath:bundlePath];
        path = [bundle pathForResource:name
                                ofType:extension];
        if (path)
        {
            return path;
        }
    }

    NSLog(@"No path found for: %@ (.%@)", name, extension);
    return nil;
}

+ (NSArray *)loadNibNamed:(NSString *)name
                    owner:(id)owner
                  options:(NSDictionary *)options
{
    // First try with the main bundle
    NSBundle * mainBundle = [NSBundle mainBundle];
    if ([mainBundle pathForResource:name
                             ofType:@"nib"])
    {
        NSLog(@"Loaded Nib named: '%@' from mainBundle", name);
        return [mainBundle loadNibNamed:name
                                  owner:owner
                                options:options];
    }

    // Otherwise try with other bundles
    NSBundle * bundle;
    for (NSString * bundlePath in [mainBundle pathsForResourcesOfType:@"bundle"
                                                          inDirectory:nil])
    {
        bundle = [NSBundle bundleWithPath:bundlePath];
        if ([bundle pathForResource:name
                             ofType:@"nib"])
        {
            NSLog(@"Loaded Nib named: '%@' from bundle: '%@' ", name, bundle.bundleIdentifier);
            return [bundle loadNibNamed:name
                                  owner:owner
                                options:options];
        }
    }

    NSLog(@"Couldn't load Nib named: %@", name);
    return nil;
}

@end

Сначала он изучит ваш пакет приложений, а затем - MYFrameworkResources.bundle и т. Д.

 01 апр. 2014 г., 03:24
У вас проблемы с изображениями? (достаточно предварения пути) или с помощью перьев? Вы также можете проверить каталог сборки, чтобы увидеть, куда копируются ресурсы внутри вашего приложения.
 Andrei Stanescu19 дек. 2012 г., 08:46
Спасибо, но разработчик интерфейса по-прежнему не может правильно определить ресурсы

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

 16 мар. 2016 г., 10:13
Этот ответ не имеет отношения к вопросу

Я создал целевой объект фреймворка и для доступа к изображениям внутри его каталога ресурсов сделал следующее:

UIImage *img = [UIImage imageNamed:@"IMAGE_NAME_HERE" inBundle:[NSBundle bundleForClass:[self class]] compatibleWithTraitCollection:[UITraitCollection traitCollectionWithDisplayScale:[UIScreen mainScreen].scale]];
 14 мар. 2018 г., 10:58
Это для динамических структур, но не для статических, так как для статических.bundleForClass:self.class возвращает основной пакет приложения.
 03 мар. 2016 г., 12:48
Большое спасибо, вы потратили много времени, пытаясь найти решение для этого. и этот работал :)

Я знаю, что это старая ветка, но чтобы помешать новым людям совершать те же ошибки, вот примечание:

Начиная с Xcode 6 и iOS8, у Apple есть полностью поддерживаемое встроенное решение Dynamic Framework. Для получения дополнительной информации смотрите здесь:https://developer.apple.com/library/ios/documentation/DeveloperTools/Conceptual/WhatsNewXcode/Articles/xcode_6_0.html#//apple_ref/doc/uid/TP40014509-SW14

Но если коротко, создайте новый проект и выберите шаблон Cocoa Touch Framework.

 27 окт. 2014 г., 16:53
Все хорошо, но удалось ли вам включить ресурсы изображений в Dynamic Framework, созданный в Xcode 6. Я сам все пробовал, но не могу заставить его работать! Кажется, очень мало документации от Apple на это.
 27 окт. 2014 г., 19:38
Вам не нужно дурачиться с созданием связки или чего-то еще. Платформа Xcode обрабатывает это для вас. Но вы должны загрузить их из этого пакета по умолчанию. Я считаю полезным создать категорию NSBundle с ярлыком для категории фреймворков.
 27 окт. 2014 г., 19:43
Да, это работает сimageNamed:inBundle:compatibleWithTraitCollection, Отправка inBundle:[NSBundle bundleWithClass[self class]] или что-либо подходящее, учитывая то, где я использую изображение.
 27 окт. 2014 г., 19:38
Да. это было довольно просто, но, возможно, не очевидно. Просто включите ваши изображения в ваш фреймворк как обычно, но чтобы загрузить их, вам нужно сослаться на пакет вашего фреймворка. Так[NSBundle bundleWithIdentifier:@"com.<#company#>.<#framework#>"];
 27 окт. 2014 г., 19:39
Кроме того, что касается будущих проблем, у вас будет большой успех в поиске справки и документации, если вы будете искать платформы Mac или платформы Cocoa Touch. Они - новички для нас, разработчиков для iOS, но они не новы для мира. Было много хорошей документации по Mac, которая выровнялась, и вот как я узнал, что они создают свой собственный пакет.

Базовые структуры не включают большинство видов ресурсов, включая использование ресурсов.это "подделка" каркасная библиотека

В итоге вы получите папку .embeddedframework, которая содержит реальную платформу, но также включает в себя любые ресурсы, которые вы добавляете на этапе сборки Copy Bundle Resources. Я использовал его, чтобы включить XIB, основные модели данных, изображения и списки

 Andrei Stanescu29 авг. 2012 г., 16:57
Да, но если у вас есть (в структуре) XIB, который использует ресурс, который также находится в структуре (скажем, изображение). Сможете ли вы загрузить XIB в тестовое приложение?
 29 авг. 2012 г., 17:04
У меня нет этого проекта передо мной, но я уверен, что все будет в порядке, попробуй ...
 13 дек. 2012 г., 08:43
Вы можете ссылаться на ресурсы, вложенные во вложенные папки из IB, добавив путь: MyResources.bundle / image.png. Он не будет хорошо выглядеть внутри IB, но будет работать
 Andrei Stanescu30 авг. 2012 г., 11:17
Я пришел к выводу, что то, чего я хочу достичь, на самом деле невозможно. Из-за неспособности Интерфейсного Разработчика отображать изображения, которые находятся во вложенных папках (хотя они работают во время выполнения), действительно невозможно доставить какие-либо ресурсы в форме пакета. Лучшим способом было бы просто добавить zip вместе со статической библиотекой, и пользователь может использовать эту папку в своем проекте.

Ваш ответ на вопрос