Xcode 在具有多个项目的工作区中构建配置
Xcode Build Configurations in Workspace With Multiple Projects
使用 Xcode 7.2 (7C68),OS X 10.11.2 (15C50)
tl;dr 在同一个 Xcode 工作区中有多个项目,为什么我的构建配置的用户定义构建设置似乎不起作用?我在方案中正确设置了它们,但是当 运行 在模拟器上时,值是正确的;当 运行 在设备上时,值是错误的。
您好。我正在尝试利用 Xcode 构建配置(.xcconfig 文件)来根据环境自定义我们应用程序的行为。这样我们就可以根据方案的构建配置自动在集成和生产 URL 之间切换。但是,我很难让它正常工作;我认为我的工作区布局可能是罪魁祸首。这是 layout/structure:
- Xcode 工作区
- iOS 应用项目(2 个目标:应用、测试)
- Cocoa Touch Framework 项目(2 个目标:框架、测试)
现在,我为这些项目的 每个 拥有以下 .xcconfig 文件:
Debug.xcconfig
Testing.xcconfig
Release.xcconfig
此外,以下方案(一对一映射到每个项目各自的配置):
- 调试
- 测试
- 发布
对于框架,这些文件包含我们希望根据调试或测试或发布进行自定义的信息(例如 URL、API tokens/keys 等)。现在,应用程序和框架都拥有自己的这些文件副本。这是因为 Xcode,在处理依赖项或多个项目时,隐式尝试在这种情况下使用相同名称的配置。我想问题的一部分是我不知道如何明确地告诉 Xcode 将 X 配置用于 不是 正在设置的配置的依赖项。
换句话说,我如何告诉 应用程序使用 X 配置和框架使用 Y 配置?
现在,当我在 模拟器 中 运行 应用程序时,我知道方案使用了正确的 info.plist 值,因为 URL 和日志设置显示正确。但是,当我在 设备 上存档或 运行 时,使用了错误的构建配置。我不知道为什么会这样。
屏幕截图和代码说明了它现在是如何工作的:
图 1:
图二:
图3(部分方法体):
if let infoDict = NSBundle(identifier: Constants.uniformTypeIdentifier)?.infoDictionary,
let apiKey = infoDict[Configuration.SerializationKeys.pusherAPIKey] as? String {
return apiKey
}
在框架内部,用户定义的构建设置包含需要针对调试、发布和任何其他内容更改的设置(图 1)。 Info.plist 文件理想地为给定方案提取变量值(图 2)。然后在代码中,我从信息 plist 中检索值(图 3)。
任何设备在被告知时都拒绝使用生产值,包括当我在我的方案的 运行 操作以及存档操作上手动切换它时 - 存档使用 returns设备上错误的构建设置。
抱歉,篇幅较长,感谢您的阅读。
最终,我决定采用此处所示的类似方法:
它在 parent 项目中添加了构建设置,以指导它如何在 child 项目中找到它需要的东西。此外,我需要获取嵌入式 .framework 文件并将其设置为相对于构建路径并使用配置设置。我确实省略了变体,只是对所有值使用 $(BUILD_DIR)/$(DEFAULT_CONFIGURATION)-$(PLATFORM_NAME)
而不是省略平台名称以最终取得成功。
随着我了解和发现更多内容,我会更新此 post。
更新时间:2016-2-29:
我删除了 .xcconfig 文件;他们没有必要。
但是,当我尝试在嵌入式框架中实际使用第三种方案时,我 运行 遇到了困难。我尝试切换 DEFAULT_CONFIGURATION
但设置不成立。省略一些细节,基本上即使指定了正确的构建目录,Xcode 在使用 parent 的构建配置设置时也会忽略这一点,并在同一目录中构建所有产品,我也相信这是一个结果"Build Implicit Dependencies" 以及 "Embed Frameworks" 构建阶段。但是如果您要删除这些然后安装到设备,应用程序会在启动时崩溃,因为它找不到框架文件。
待续...
使用 Xcode 7.2 (7C68),OS X 10.11.2 (15C50)
tl;dr 在同一个 Xcode 工作区中有多个项目,为什么我的构建配置的用户定义构建设置似乎不起作用?我在方案中正确设置了它们,但是当 运行 在模拟器上时,值是正确的;当 运行 在设备上时,值是错误的。
您好。我正在尝试利用 Xcode 构建配置(.xcconfig 文件)来根据环境自定义我们应用程序的行为。这样我们就可以根据方案的构建配置自动在集成和生产 URL 之间切换。但是,我很难让它正常工作;我认为我的工作区布局可能是罪魁祸首。这是 layout/structure:
- Xcode 工作区
- iOS 应用项目(2 个目标:应用、测试)
- Cocoa Touch Framework 项目(2 个目标:框架、测试)
现在,我为这些项目的 每个 拥有以下 .xcconfig 文件:
Debug.xcconfig
Testing.xcconfig
Release.xcconfig
此外,以下方案(一对一映射到每个项目各自的配置):
- 调试
- 测试
- 发布
对于框架,这些文件包含我们希望根据调试或测试或发布进行自定义的信息(例如 URL、API tokens/keys 等)。现在,应用程序和框架都拥有自己的这些文件副本。这是因为 Xcode,在处理依赖项或多个项目时,隐式尝试在这种情况下使用相同名称的配置。我想问题的一部分是我不知道如何明确地告诉 Xcode 将 X 配置用于 不是 正在设置的配置的依赖项。
换句话说,我如何告诉 应用程序使用 X 配置和框架使用 Y 配置?
现在,当我在 模拟器 中 运行 应用程序时,我知道方案使用了正确的 info.plist 值,因为 URL 和日志设置显示正确。但是,当我在 设备 上存档或 运行 时,使用了错误的构建配置。我不知道为什么会这样。
屏幕截图和代码说明了它现在是如何工作的:
图 1:
图二:
图3(部分方法体):
if let infoDict = NSBundle(identifier: Constants.uniformTypeIdentifier)?.infoDictionary,
let apiKey = infoDict[Configuration.SerializationKeys.pusherAPIKey] as? String {
return apiKey
}
在框架内部,用户定义的构建设置包含需要针对调试、发布和任何其他内容更改的设置(图 1)。 Info.plist 文件理想地为给定方案提取变量值(图 2)。然后在代码中,我从信息 plist 中检索值(图 3)。
任何设备在被告知时都拒绝使用生产值,包括当我在我的方案的 运行 操作以及存档操作上手动切换它时 - 存档使用 returns设备上错误的构建设置。
抱歉,篇幅较长,感谢您的阅读。
最终,我决定采用此处所示的类似方法:
它在 parent 项目中添加了构建设置,以指导它如何在 child 项目中找到它需要的东西。此外,我需要获取嵌入式 .framework 文件并将其设置为相对于构建路径并使用配置设置。我确实省略了变体,只是对所有值使用 $(BUILD_DIR)/$(DEFAULT_CONFIGURATION)-$(PLATFORM_NAME)
而不是省略平台名称以最终取得成功。
随着我了解和发现更多内容,我会更新此 post。
更新时间:2016-2-29:
我删除了 .xcconfig 文件;他们没有必要。
但是,当我尝试在嵌入式框架中实际使用第三种方案时,我 运行 遇到了困难。我尝试切换 DEFAULT_CONFIGURATION
但设置不成立。省略一些细节,基本上即使指定了正确的构建目录,Xcode 在使用 parent 的构建配置设置时也会忽略这一点,并在同一目录中构建所有产品,我也相信这是一个结果"Build Implicit Dependencies" 以及 "Embed Frameworks" 构建阶段。但是如果您要删除这些然后安装到设备,应用程序会在启动时崩溃,因为它找不到框架文件。
待续...