如何创建iOS资源包?

60

我在评估的iOS项目中看到了一个自定义的资源包,因此至少我知道这是可能的。

我的问题是,我正在使用一个CATiledLayer来处理一张图片的约22,000个瓦片,并且编译时间非常长(半小时干净构建,普通构建需要5-10分钟)。因此,我希望将所有图像制作成自定义的资源包,以便使其可移植,并且希望它不会每次重新编译到应用程序包中。

我该怎么做?我查阅了文档,但没有看到有关如何实际创建该资源包的说明。

7个回答

108

答案非常简单

在Finder中创建一个文件夹,将文件添加到其中,将其重命名为bundlename.bundle

将其拖入Xcode-成功!

要访问,请使用PathToMainBundle+"/bundlename.bundle"的形式


4
对我没用。我无法访问资产包中的文件,因为该包未加载,当我加载该包时,出现错误提示说无法加载该包,因为找不到其可执行文件。 - LandedGently
1
@LandedGently,我刚遇到了同样的问题,结果发现问题不是因为bundle没有加载。而是因为我在 pathForResource:ofTypeofType 部分使用了大写字母(ofType:@"PNG"),这在模拟器上可以正常工作,但在实际设备上不行。因此,我想说您无需调用非可执行bundle上的load方法来获取资源。 - Hari Honor
1
但那不是一个捆绑包。它只是一个名字中带有“bundle”的文件夹。 - matt
2
@michael,同意你的观点,但如果这只是一个“文件夹”,那么在这里发生的事情将与没有.bundle后缀的情况下发生的事情相同。换句话说,对于“bundle”而言,您的定义和期望是什么?如果您想要的只是将一堆东西拖到Xcode中以包含在应用程序中,那么您可以在不重命名为.bundle后缀的情况下完成此操作。 - matt
2
@michael 我的目标不是要给你添麻烦。我在寻找是否有一种方法可以在iOS中真正地加载一个真正的bundle,但是由于你的问题和回答(以及其他回答)误导了我很长时间。我的评论旨在警告其他人。在我看来,你的代码并没有像你描述的那样做。它只是以完全正常的方式引用了一个文件夹。 - matt
显示剩余6条评论

43

如何创建一个bundle

  1. 在Finder中创建一个文件夹。
  2. 将文件添加到文件夹中。
  3. 重命名该文件夹,使其扩展名为.bundle(例如,"New folder" -> "BundleName.bundle")。

提示:您随时可以右键单击文件夹并点击“显示包内容”,以添加、删除或修改任何文件。

如何将bundle添加到Xcode

  1. 将其拖入Xcode中。

如何使用bundle

NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"BundleName" ofType:@"bundle"];
NSBundle *bundle = [NSBundle bundleWithPath:bundlePath]; 
NSString *resource = [bundle pathForResource:@"fileName" ofType:@"fileType"];

(用适当的名称替换BundleNamefileNamefileType


27

另外还有两个有用的建议:

首先,在Xcode中查看Bundle的内容,您需要在文件检查器实用面板中设置其类型为“应用程序Bundle”。您仍然无法通过Xcode复制到和复制。您需要使用终端,但Xcode会立即更新它。

其次,为了在Bundle中使用资源,这是一个有用的代码片段...

NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"AquarianHarp" ofType:@"bundle"];
NSString *imageName = [[NSBundle bundleWithPath:bundlePath] pathForResource:@"trebleclef2" ofType:@"png"];
UIImage *myImage = [[UIImage alloc] initWithContentsOfFile:imageName];

如我在上面的评论中提到的那样,你实际上不需要加载bundle(因为它不能执行),而且ofType需要与你实际文件的大小写匹配,这样才能在设备上工作。在模拟器中两种方式都可以使用,所以不要被这个红色警告所迷惑!

最后,你不需要将资源放置在bundle的“Resources”子文件夹中。似乎你可以使用任意布局,但可能存在未知的性能影响。


另外,如果您的 Bundle 中有文件夹,请确保文件夹名称中不包含空格。模拟器可以正常工作,但是设备不允许文件夹名称中有空格。 - LandedGently

10

这是我让它正常工作的方法:在Xcode中创建一个新文件|资源|设置束。然后在Finder中选择该束并选择“显示包内容”,然后添加任何图像文件。

然后在代码中引用图像的方式如下:

NSString *imgName = @"bundlename.bundle/my-image.png";
UIImage *myImage = [UIImage imageNamed:imgName]; 

1
但是从实质上讲,这不是一个“bundle”。它只是一个文件夹。您只需按照通常从文件夹加载图像的方式进行操作即可。 - matt

5
以下是创建资产或资源包 (例如 FrameworkResources.bundle) 的步骤 - 这非常不明显,尤其适用于创建静态框架。
  1. 在 Xcode 中按下 File -> New -> Target
  2. 选择 "macOS" 选项卡,在搜索栏中搜索 "Bundle"
  3. 点击 "Bundle" -> 点击 "Next" -> 输入产品名称 "MyResources" -> 点击 "Finish"
  4. 到新创建的 Bundle 的 "Build Settings"。将 "Base SDK" (SDKROOT) 更改为 "iOS"
  5. 到新创建的 Bundle 的 "Build Phases"。删除 "Compile Sources" 和 "Link Binary With Libraries" (这将移除包中的可执行文件,这可能会导致各种构建和应用提交错误)

0

关于在Xcode项目中打包和读取文件的笔记

步骤:

  1. 创建一个名为test.bundle的文件夹,并添加文本“testing”到其中的test.txt文件中
  2. 将其拖放到Xcode中与.app文件相邻的位置(复制)
  3. print(Bundle.main.resourcePath!+"/temp.bundle/test.txt") 输出:/Users/James/Library/Developer/Xcode/DerivedData/GitSyncMac-heiwpdjbtaxzhiclikjotucjguqu/Build/Products/Debug/GitSyncMacApp.app/Contents/Resources/temp.bundle/test.txt

示例:

print(content(Bundle.main.resourcePath!+"/temp.bundle/test.txt")) // testing
static func content(_ path:String)->String?{
    do {
        let content = try String(contentsOfFile:path, encoding:String.Encoding.utf8) as String//encoding: NSUTF8StringEncoding
        return content
    } catch {
        return nil
    }
}

0

创建可加载的捆绑项目就像创建应用程序一样,您只需要选择适当的项目模板即可。执行以下步骤创建可加载的捆绑项目:

  1. 启动 Xcode。
  2. 从文件菜单中选择“新建项目…”。
  3. 从模板列表中选择Cocoa Bundle。
  4. 点击下一步。
  5. 选择项目的位置并单击完成。

构建和运行,在Xcode中,您将在项目导航器的产品文件夹中看到捆绑文件。右键单击捆绑并选择“在Finder中显示”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接