我有一个相对较大的Xcode项目,可以生成一个应用程序。但是,我有很多客户/客户需要对所述应用程序进行深度定制和品牌化。这些配置包括不同的图形,一些不同的接口和实现,也许最重要的是.xcconfig文件。
我的Xcode项目有一个专用组,指向磁盘上特定客户端的自定义文件夹,因此通过打开Xcode项目并构建,您将获得具有当前客户端自定义的单个应用程序的构建。要切换到另一个客户端,我会更改该组指向磁盘的位置。 (我还更改并切换项目的“信息”窗格中的xcconfig“基于”设置以重新加载完整的xcconfig继承;只需更改包含一个或多个xcconfig文件的组就不会重新加载!)这对100有用+客户。每次需要为不同的客户端构建应用程序并确保xcconfig正确时,切换此文件夹有点乏味,但它可以正常工作。
现在我正在通过命令行自动构建,并遇到麻烦。将上述Xcode组指向不同的自定义文件夹的快速而肮脏的解决方案是将ProjectName.xcodeproj/project.pbxproj
文件复制到ProjectName.xcodeproj/project-template.pbxproj
并将占位符放在此文件中,该文件可以被grepped并替换为名称和路径所需的自定义文件夹。然后,使用修改后的project-template.pbxproj临时覆盖project.pbxproj,并构建以获取正确的应用程序。
正如您可能已经观察到的那样,project.pbxproj被复制和修改,因此当开发人员修改原始文件并忘记更新模板时,它将不同步。此外,我不应该以这种方式搞乱pbxproj文件 - 这是Xcode的私密内容。
那么,是否有更好的方法可以在构建阶段使用脚本或环境变量而不是在项目组级别告诉Xcode关于充满资源,代码和配置文件的文件夹?最复杂的一点似乎是xcconfig链,因为每个客户端都有自己的xcconfig文件,该文件继承自单个应用程序的Debug,Development和Distribution xcconfig文件。
对不起这个问题的长篇大论,但它有点复杂!任何建议将不胜感激!
答案 0 :(得分:2)
我认为在Xcode中使用目标功能会更好。在该项目中有一个项目和每个客户端的资源。
然后,您可以复制已有的目标(右键单击目标,方法是在Xcode的Project Navigator中选择项目文件)。
所有目标都将使用相同的代码进行编译。您只需要在Build Phases>中更改资源。复制捆绑资源以为每个目标创建不同的应用程序。无需查看Xcode的内部文件。
您甚至可以通过在构建选项中添加预处理器宏(类似FIRST_CLIENT=1
)来更改源文件中的代码,然后使用#if FIRST_CLIENT
在文件中查找这些定义。
我有一个像这样的项目设置,它运作得很好:
http://f.cl.ly/items/3G0b0P35261x3O263h14/Screen%20Shot%202011-10-18%20at%2013.55.55.PNG