如何使用静态库传输资源文件(如何将资源包装在包中)?

Posted

技术标签:

【中文标题】如何使用静态库传输资源文件(如何将资源包装在包中)?【英文标题】:How to transfer resource files with Static Library (How to wrap resources in bundle)? 【发布时间】:2013-04-30 10:28:50 【问题描述】:

我正在为ios 应用程序创建一个Static Library。我差不多完成了,但是资源有问题。

我的静态库使用了大量的图像和声音文件。如何使用我的静态库传输它?

我知道我们可以将它打包成一个捆绑包,并与.a 文件一起提供。但我不知道如何将图像和声音文件包装在 Bundle 文件中。

我做了什么:

我搜索了很多,但找不到任何有用的链接。 我得到了Conceptual CFBundles 参考,但没有找到任何解决我的问题的方法。 我检查了 XCode 可用的文件模板,但没有看到除 Settings Bundle. 之外的任何包类型

【问题讨论】:

【参考方案1】:

有几个很好的理由来构建一个包含多个捆绑包的应用程序以及几种不同的方法。根据我的经验,最好的方法是打开 Xcode 并创建一个新的捆绑项目:

    选择:文件 -> 新项目... -> 组 Mac OSX (!) -> 框架和库 -> 捆绑包。将您的资源文件添加到项目中。 在构建其他 iPhone 应用程序时构建捆绑包。 您可以将此项目添加到您的静态库项目中,并在库更改时重新构建它。您必须知道捆绑包本身不会链接到您的库文件。 在您的应用项目中,将 .bundle 文件作为普通资源文件添加到您的项目中(添加 -> 现有文件... -> 找到并选择上面构建的 .bundle 文件。不要复制它)。

例子:

// Static library code:
#define MYBUNDLE_NAME       @"MyResources.bundle"   
#define MYBUNDLE_IDENTIFIER @"eu.oaktree-ce.MyResources"
#define MYBUNDLE_PATH       [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: MYBUNDLE_NAME]
#define MYBUNDLE            [NSBundle bundleWithPath: MYBUNDLE_PATH]

// Get an image file from your "static library" bundle:

- (NSString *) getMyBundlePathFor: (NSString *) filename

        NSBundle *libBundle = MYBUNDLE;
        if( libBundle && filename )
            return [[libBundle resourcePath] stringByAppendingPathComponent: filename];
        
        return nil;


// .....
// Get an image file named info.png from the custom bundle
UIImage *imageFromMyBundle = [UIImage imageWithContentsOfFile: [self getMyBundlePathFor: @"info.png"] ];

如需更多帮助,您可以查看这些好文章

    iOS Library With Resources

    Resource Bundles

希望对你有所帮助。

【讨论】:

谢谢你的回答:) 一件事:imageWithContentsOfFile 在性能方面很差,最好使用 imageNamed,因为它正在使用缓存,所以它可以更快:) 此外,您可以通过简单的代码用更少的代码实现相同的结果:@987654324 @ 并简单地输入正确的包名称 集成这样的库需要两件事,.a 文件和 .bundle 文件,对吧?哪个用户必须手动单独导入?

以上是关于如何使用静态库传输资源文件(如何将资源包装在包中)?的主要内容,如果未能解决你的问题,请参考以下文章

在包中找不到属性“layout_behavior”的资源标识符

iOS:将资源(音频)文件包含到应用程序的应用程序文件夹中,而不是添加到包中

VS2015 MFC - 如何将静态库资源链接到项目

在包中找不到属性“barrierDirection”的资源标识符 - ConstraintLayout Barrier

带有 GCC 的 C/C++:将资源文件静态添加到可执行文件/库

如何防止 Eclipse 在包资源管理器中显示打开的文件