iOS:通过Xcode目标构建资源包

10
我想通过Xcode目标从我的静态库资源文件创建一个Resource Bundle。我看到Three20有一个需要导入的.bundle文件。我该如何做?
2个回答

18

重要声明:

苹果公司不认可此解决方案。我曾与一名在Xcode上工作的开发人员交谈,他们告诉我,在iOS中,资源束不受支持,他们对这个方法能运行感到惊讶。

该解决方案在iOS 9到13上都适用于手机和平板电脑。但是,未来的iOS更新可能会破坏此方法。请注意这一点。

现在进入答案:

虽然我回答这个问题已经晚了8年,但由于我偶然发现了这个问题,还有其他人可能也会遇到同样的问题,所以我想提供一个有用的答案。

步骤1. 创建一个新的Target

enter image description here

  • 确保您已经在项目导航器中选择了您的项目
  • 点击Targets列表底部的+

步骤2. 创建一个macOS Bundle

enter image description here

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

步骤2 (续). 创建一个macOS Bundle

enter image description here

  • 给你的bundle起个名字
  • 点击“完成”

第三步:从macOS更改基本SDK为iOS

显示图片描述

  • 确保您已经选择了新的资源包目标
  • 进入构建设置
  • 查找Base SDK并将其从macOS更改为iOS

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

第四步:替换iOS资源包

显示图片描述

  • 确保您已经选择了应用程序目标(而不是资源包)
  • 进入构建阶段
  • 选择所有资源
  • 按下-按钮以删除它们

第四步(续):替换iOS资源包

显示图片描述

  • 按下+按钮以向iOS应用程序添加新的资源包(未显示)
  • 选择您的资源包产品
  • 点击“添加”

第五步:设置依赖项

输入图片描述

  • 打开“依赖项”部分(仍然在“构建阶段”下,仍然在您的应用程序中,而不是资源包中)
  • 点击“+”按钮添加新的依赖项

第五步(续):设置依赖项

输入图片描述

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

现在你已经完成了!

完成所有这些步骤后,您将构建一个与iOS兼容的资源包,并将其嵌入到您的应用程序中进行加载。这并不是那么直观,很多文章可能会说这是不受支持的,但我在一款发布的应用中使用了这个功能,它完美地工作。

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

输入图片描述

重要提示

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

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

输入图像说明


3
非常感谢你。你关于版本控制系统的提示帮我省了很多时间! - OdNairy
你能解释一下为什么你说这是不支持的吗?当前文档没有提到这些在iOS上不受支持,甚至标记为iOS 2.0+,而Apple bundle programming指南以文本“Bundles are a fundamental technology in macOS and iOS...”开头。 - TonyLovesDevOps
@TonyLovesDevOps 我通常不从事iOS开发(我曾为一份工作学习了一个月),而且这是两年前的事情,但据我所记:iOS通常会隐式地创建一个单独的bundle,但创建一个单独的bundle target是不被支持的。这种方法甚至涉及创建一个MacOS bundle并欺骗它在iOS上运行。苹果提供付费的高级开发者支持,正是通过这个渠道(支付费用与他们的工程师交流)我被告知这是不被支持的。 - stevendesu

7
一个bundle就是一个带有特殊结构和.bundle扩展名的目录。您可以在文档中了解更多细节。 编辑: 重要的是,bundle只是一个以特殊扩展名命名的普通文件夹。例如,如果您有一个名为MyBundle.bundle的文件夹,并且其中有一个名为image.png的图像,您可以使用[UIImage imageNamed:@"MyBundle.bundle/image.png"];来加载它。因此,无需通过Xcode目标构建它。实际上,在iOS项目中不可用。您可以在项目中添加复制文件生成阶段或shell脚本。
这很简单而又强大。例如,如果您遵循文档中列出的框架的特殊结构,可以使用简单的方法、shell脚本或ant任务或rake文件将静态库构建到框架中。只要输出目录符合结构并命名为Something.framework,即使在iOS上,也可以将其用作框架。

3
这份文档没有提供那些信息——它很含糊,避重就轻,并忽略了实际问题。我之所以从谷歌来到这里,是因为我已经阅读了你链接的文档,尽管它们适用于OS X,但大部分iOS细节都没有包含在内。我会投下反对票。 - Adam
@Adam,希望我已经提供了更多关于我的想法和链接文档的原因的细节。 - Don

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