ios - 为面向许多客户的项目交换 Xcode 内容的最佳方式是什么?

标签 ios xcode xcode4 xcconfig

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

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

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

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

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

很抱歉这个问题冗长,但它有点复杂!任何建议将不胜感激!

最佳答案

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

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

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

您甚至可以通过在构建选项中添加预处理器宏来更改源文件中的代码(类似于 FIRST_CLIENT=1),然后使用 在您的文件中查找这些定义#如果是 FIRST_CLIENT

我有一个这样的项目设置,它运行良好:

enter image description here

关于ios - 为面向许多客户的项目交换 Xcode 内容的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7811470/

相关文章:

ios - 与 Aspect Fill 类似的行为,但使用图像的顶部

ios - RestKit - 实体(null)与键 "id"的键值编码不兼容

ios - 在 ios 中测试应用内购买

Git 帮助 UserInterfaceState.xcuserstate : warning: Merge conflict: File still marked as conflicted

cocoa-touch - 关于如何学习 Cocoa Touch API 有什么建议吗?

objective-c - Xcode 4 : Unknown type name 'NSUInteger' ; did you mean 'NSUInteger' ?

iphone - 无法读取/Developer/Platforms/iPhoneOS.platform/DeviceSupport/4.2.1 的符号

ios - 图像继续快速重新加载到 Collection View 单元格中

ios - 警告 : The Copy Bundle Resources build phase contains this target's Info. plist 文件

ios - 如果由 Interface Builder 为 Xcode 4.5 和 iPhone 5 构建,如何使 View 中的控件不重叠?