Xcode在具有多个项目的工作区中构建配置

时间:2015-12-22 23:52:42

标签: xcode buildconfiguration xcconfig xcode-workspace

使用Xcode 7.2(7C68),OS X 10.11.2(15C50)

tl; dr 在同一个Xcode工作区中有多个项目,为什么构建配置的用户定义构建设置似乎不起作用?我在方案中正确设置它们,但在模拟器上运行时,值是正确的;在设备上运行时,值是错误的。

您好。我正在尝试利用Xcode构建配置(.xcconfig文件)来根据环境自定义应用程序的行为。这样我们就可以根据方案的构建配置自动在集成和生产URL之间切换。但是,我很难让它正常工作;我认为我的工作空间布局可能是罪魁祸首。这是布局/结构:

  • Xcode工作区
    • iOS应用项目(2个目标:应用,测试)
    • Cocoa Touch Framework项目(2个目标:框架,测试)

现在,我有每个这些项目的以下.xcconfig文件:

  • Debug.xcconfig
  • Testing.xcconfig
  • Release.xcconfig

此外,以下方案(将每个项目的一对一映射到其各自的配置):

  • 调试
  • 测试
  • 推出

对于框架,这些文件包含我们希望根据调试或测试或发布自定义的信息(例如URL,API令牌/密钥等)。现在,应用程序和框架都有自己的文件副本。这是因为Xcode在处理依赖项或多个项目时,会隐式尝试在此场景中使用相同名称的配置。我想部分问题是我不知道如何明确地告诉Xcode使用X配置来获取不是正在设置的配置。

换句话说,如何判断两者应用程序使用X配置和框架使用Y配置?

现在,当我在模拟器中运行应用程序时,我知道该方案正在使用正确的info.plist值,因为URL和日志设置显示正确。但是,当我在设备上存档或运行时,会使用错误的构建配置。我不知道为什么会这样。

屏幕截图和代码说明了它现在的工作原理:

图1:Info.plist

图2:Framework build settings

图3(某种方法的部分主体):

if let infoDict = NSBundle(identifier: Constants.uniformTypeIdentifier)?.infoDictionary,
        let apiKey = infoDict[Configuration.SerializationKeys.pusherAPIKey] as? String {
            return apiKey
    }

在框架内部,用户定义的构建设置包含需要针对调试版本与发布版本进行更改的设置(图1)。 Info.plist文件理想地为给定方案提取变量值(图2)。然后在代码中我从info plist中检索值(图3)。

任何设备在被告知这样做时都拒绝使用生产值,包括当我在我的方案的“运行”操作以及“存档”操作上手动切换时 - 存档使用会在设备上返回错误的构建设置。

对不起,这很长,谢谢你的阅读。

1 个答案:

答案 0 :(得分:3)

最终,我决定使用类似的方法:

How to compile a project with app and library in the same workspace with different configuration names?

它在父项目中添加了构建设置,以指导它如何在子项目中找到它所需的内容。另外,我需要获取嵌入的.framework文件并相对于构建路径设置它并使用配置设置。我确实忽略了变体,只使用$(BUILD_DIR)/$(DEFAULT_CONFIGURATION)-$(PLATFORM_NAME)表示所有值,而不是从平台名称中删除,最终取得成功。

随着我的学习和发现更多内容,我会更新这篇文章。

更新:2016-2-29:

我删除了.xcconfig文件;他们没有必要。

但是,当我试图在嵌入式框架中实际使用第三种方案时,我遇到了困难。我尝试切换DEFAULT_CONFIGURATION,但设置不成立。省略一些细节,基本上即使指定了正确的构建目录,Xcode也会在使用父级的构建配置设置时忽略这一点,并在同一目录中构建所有产品,我也认为这是“构建隐式依赖关系”以及“嵌入框架”构建阶段。但是如果您要删除这些并安装到设备,则应用程序会在启动时崩溃,因为它无法找到框架文件。

继续......