【问题标题】:iOS: Build a Resource Bundle via Xcode TargetiOS:通过 Xcode Target 构建资源包
【发布时间】:2011-12-10 18:45:39
【问题描述】:

我想通过 xcode 目标从我的静态库的资源文件中创建资源包。我看到 Three20 有一个需要导入的 .bundle 文件。

我该怎么做?

【问题讨论】:

    标签: ios xcode bundle target


    【解决方案1】:

    重要免责声明:

    Apple 不认可此解决方案。当我与 Apple 的一位从事 Xcode 工作的开发人员交谈时,他们告诉我 iOS 不支持资源包,他们对这完全有效感到惊讶。

    此解决方案适用于 iOS 9 至 13,包括手机和平板电脑。但是,未来对 iOS 的更新可能会打破这一点。请注意这一点。

    现在开始回答:

    我知道这已经晚了 8 年,但由于我偶然发现了这个问题,因此很有可能其他人会这样做,所以我想我会提供一个有用的答案。

    步骤 1. 创建新目标

    • 确保您在 Project Navigator 中选择了您的项目
    • 点击目标列表底部的+

    第 2 步。创建 macOS 捆绑包

    我们将在第 3 步中将其转换为 iOS Bundle

    第 2 步(续)。创建一个 macOS 包

    • 为您的捆绑包命名
    • 点击“完成”

    步骤 3. 将 Base SDK 从 macOS 更改为 iOS

    • 确保选择了新的资源包目标
    • 转到构建设置
    • 查找Base SDK 并将此值从macOS 更改为iOS

    此时,您的问题在技术上已完成(为 iOS 创建资源包目标),但需要进行一些配置才能使其正常工作

    步骤 4. 替换 iOS Bundle 资源

    • 确保您选择了应用目标(不是资源包)
    • 转到构建阶段
    • 选择所有资源
    • - 按钮将其删除

    第 4 步(续)。替换 iOS Bundle 资源

    • + 按钮将新的捆绑资源添加到 iOS 应用程序(未图示)
    • 选择您的捆绑产品
    • 点击“添加”

    步骤 5. 设置依赖项

    • 打开 Dependencies 部分(仍在 Build Phases 下,仍在您的应用程序中,而不是资源包中)
    • 单击+ 按钮添加新的依赖项

    第 5 步(续)。设置依赖项

    • 选择资源包项目
    • 点击“添加”

    现在你已经完成了!

    完成所有这些步骤后,您将构建与 iOS 兼容的资源包并将其嵌入到要加载的应用程序中。它不是那么直截了当,很多文章可能会说这是不受支持的,但我已经在已发布的应用程序中使用了此功能,并且效果很好

    请记住,如果您现在想将任何资源(PNG、XIB 文件等)添加到您的应用中,您需要将它们添加到捆绑包而不是应用中,如下所示:

    重要的陷阱

    设置完成后,再次检查资源包的构建设置。查找标题为“版本控制系统”的设置。此值必须设置为None。如果设置为Apple Generic,您在尝试推送到应用商店时遇到问题!

    Apple 的版本控制系统将创建一个*_vers.c 文件,对其进行编译,然后将此二进制文件嵌入到您的包中。由于这不是一个有效的 CFBundleExecutable,它会导致您的应用被拒绝并出现错误 ITMS-90171

    【讨论】:

    • 非常感谢。您对版本控制系统的提示为我节省了很多时间!
    【解决方案2】:

    bundle 只是一个具有特殊结构和 .bundle 扩展名的目录。您可以在documentation 中阅读有关详细信息的更多信息。

    编辑:

    重要的是,bundle 只是一个以特殊扩展名命名的普通文件夹。例如,如果您有一个名为 MyBundle.bundle 的文件夹和一个名为 image.png 的图像,则可以使用 [UIImage imageNamed:@"MyBundle.bundle/image.png"]; 加载它,因此无需通过 Xcode 目标构建它。事实上,它在 iOS 项目中不可用。您的项目中可能有一个 Copy Files 构建阶段,或者一个 shell 脚本。

    这很简单,而且功能强大。例如,如果您符合框架文档中列出的特殊结构,您可以使用简单的方法、shell 脚本或 ant 任务或 rake 文件将静态库构建到框架中。只要输出目录符合结构并命名为Something.framework,你就可以将其用作Framework,即使在iOS上也是如此。

    【讨论】:

    • 文档没有提供该信息 - 它含糊不清,挥手致意,忽略了实际问题。我专门从 Google 来到这里,因为我阅读了您链接到的文档,虽然它们适用于 OS X,但大多数 iOS 细节都丢失了。投反对票。
    • @Adam,希望我在我的想法和链接到文档的原因背后提供了更多详细信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    相关资源
    最近更新 更多