7

我有一个相对较大的 Xcode 项目,可以生成一个应用程序。但是,我有许多客户/客户需要对所述应用进行深度定制和品牌推广。这些配置包括不同的图形、一些不同的接口和实现,也许最重要的是 .xcconfig 文件。

我的 Xcode 项目有一个专门的组,它指向磁盘上特定客户端的自定义文件夹,因此通过打开 Xcode 项目并构建,您可以获得具有当前客户端自定义的单个应用程序的构建。要切换到另一个客户端,我更改了该组在磁盘上指向的位置。(我还更改并切换回项目信息窗格中的 xcconfig“基于”设置以重新加载完整的 xcconfig 继承;只需更改包含一个或多个 xcconfig 文件的组不会重新加载它!)这对 100 + 客户。每次需要为不同的客户端构建应用程序并确保 xcconfig 正确时切换此文件夹有点乏味,但它可以工作。

现在我正在通过命令行自动化构建,并遇到了麻烦。将上述 Xcode 组指向不同的自定义文件夹的快速而肮脏的解决方案是将文件复制到该ProjectName.xcodeproj/project.pbxproj文件ProjectName.xcodeproj/project-template.pbxproj并将占位符放在该文件中,该文件可以被 grep 并替换为所需自定义文件夹的名称和路径。然后,用修改后的 project-template.pbxproj 临时覆盖 project.pbxproj,并构建以获得正确的应用程序。

正如您可能已经观察到的那样,project.pbxproj 被复制和修改,因此当开发人员修改原始文件并忘记更新模板时,它会变得不同步。此外,无论如何,我不应该以这种方式处理 pbxproj 文件——那是 Xcode 的私有内容。

那么,有没有更好的方法来告诉 Xcode 一个充满资源、代码和配置文件的文件夹,可能在构建阶段使用脚本或环境变量,而不是在项目组级别?最复杂的部分似乎是 xcconfig 链,因为每个客户端都有自己的 xcconfig 文件,该文件继承自单个应用程序的调试、开发和分发 xcconfig 文件。

对不起这个问题的啰嗦,但它有点复杂!任何建议将不胜感激!

4

1 回答 1

2

我认为您最好使用 Xcode 中的目标功能。拥有一个项目以及该项目中每个客户的资源。

然后,您可以复制已有的目标(右键单击目标,在 Xcode 的 Project Navigator 中选择项目文件)。

您的所有目标都将使用相同的代码进行编译。您只需要更改 Build Phases > Copy Bundle Resources 中的资源,即可为每个目标创建不同的应用程序。无需查看 Xcode 的内部文件。

您甚至可以通过在构建选项中添加预处理器宏(类似于FIRST_CLIENT=1)来更改源文件中的代码,然后使用#if FIRST_CLIENT.

我有一个这样的项目设置,效果很好:

在此处输入图像描述

于 2011-10-18T18:04:34.280 回答