4

使用 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 和日志设置看起来是正确的。但是,当我在device上存档或运行时,使用了错误的构建配置。我不知道为什么会这样。

屏幕截图和代码说明了它现在是如何工作的:

图1:信息列表

图 2:框架构建设置

图 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)。

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

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

4

1 回答 1

3

最终,我决定采用类似的方法,如下所示:

如何在具有不同配置名称的同一工作区中编译具有应用程序和库的项目?

它在父项目中添加构建设置,以指导它如何在子项目中找到它需要的东西。此外,我需要获取嵌入式 .framework 文件并将其设置为相对于构建路径并使用配置设置。我确实省略了变体并仅用于$(BUILD_DIR)/$(DEFAULT_CONFIGURATION)-$(PLATFORM_NAME)所有值,而不是省略平台名称以最终取得成功。

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


更新:2016-2-29:

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

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

待续...

于 2016-02-04T04:03:09.580 回答