.xcconfig是什么?如何设置环境变量

5

我是新手使用Xcode。

过去两天里,我一直试图弄清楚如何在我的iPhone上测试访问Web服务的应用程序。在模拟器中,我可以使用硬编码的“localhost”变量,但我不想硬编码所有配置设置。

我正在使用Swift + Xcode 6,但我认为这与Xcode 5的过程相同。

我查看了许多文章,我认为我应该使用.xcconfig文件,但这非常不清楚。

例如,我创建了一个Environment.xcconfig文件。我填充了它:

API_BASE_URL = "http://localhost:4000/api/v1"

我进入项目 -> 信息,并将调试配置文件设置为Environment

然后,我尝试通过${API_BASE_URL}在代码中访问变量,但是我得到了未解决的标识符'API_BASE_URL'的使用

这非常令人沮丧。有任何想法吗?

2个回答

9
  1. 如果您有Pods配置,则需要设置配置层次结构: enter image description here

或者,如果您没有任何Pods,则配置层次结构将如下所示: enter image description here

  1. 为每个配置文件创建所有的键值对(在本例中,开发/ adhoc / appstore版本有3个配置文件)。每个配置文件都有相同的一组键: enter image description here

  2. 将每个键添加到生成器中: enter image description here

  3. 然后只需在代码中使用这些键: enter image description here

注意:以这种方式生成的键也可以在.swift文件中识别(请确保Swift项目中有桥接头,即使您不使用obj-c源文件,它也将是空的)。

针对Swift 2.2的更新:不再适用 Swift 2.2:GCC_PREPROCESSOR_DEFINITIONS常量不再被导入


我似乎无法从Swift中读取这些值。我是不是产生了幻觉? - Ali
@exalted 你有包含生成器文件吗?无论如何,请尝试在同一个xcconfig文件中生成定义。 - kas-kad
哦,太好了!你能解释一下GCC_PREPROCESSOR_DEFINITIONS背后的“魔法”吗?为什么它比其他键更“特殊”,以至于它的值可以在代码中使用? - Ali
1
发现问题。在Swift中,需要桥接头文件(即使是空的)才能使预处理指令正常工作。 - Evgeny Aleksandrov
2
@EvgenyAleksandrov 是的,这是一个已知的错误:https://dev59.com/npXfa4cB1Zd3GeqPf39I - olivier
显示剩余9条评论

1
你不需要使用 .xcconfig 文件;它存储 Xcode 的设置。相反,你需要一个属性列表 (.plist) 文件。为此,请按下 command-N 创建一个新文件,然后选择 iOS > Resources > Property List。使用 plist 编辑器添加键、值和值类型。然后通过在应用程序中的某个位置添加这些行来加载你的属性:
if let filePath = NSBundle.mainBundle().pathForResource("Latin Conjugations", ofType:"plist") {
    let plist = NSDictionary(contentsOfFile:filePath)
}

你可以通过plist字典像访问其他字典值一样访问属性。请注意,它不是一个Swift Dictionary,因为它没有一个可以接受文件路径加载的构造函数。 更新于10/21/2015: 此答案现在符合Swift 2.0。 pathForResource()现在返回一个可选项。

3
谢谢,这真的很有帮助。如果我有三个环境:开发、预演和生产,那么我应该创建三个plist文件吗?如果是这样,我如何告诉Xcode在模拟器、设备和生产中加载哪个plist文件呢? - netwire
1
@NRitH,pathForResource的结果是可选类型,因此我会进行条件解包。 - Paul Peelen
@PaulPeelen,我在一年多以前回答这个问题时,pathForResource()没有返回可选项。我会更新我的原始答案。 - NRitH
2
是的,我确实想要xcconfig。区别在于,xcconfig中的值将被放入您的代码中,而plist将保持为纯文本。因此,想象一下API密钥-我们应该尽可能地保护它,并将其放置在我们的代码中是最好的选择。使用xcconfig允许我们轻松替换CLI / CI中的值->连续集成。 - smat88dd
xcconfig是Xcode的配置设置。它们的目的是存储Xcode的设置。推荐观看“在Xcode中探索高级项目配置” WWDC21-10210。请参见https://developer.apple.com/videos/play/wwdc2021/10210/ 建议编辑此答案,因为我认为@NRitH实际上的意思是“不要使用xcconfig来存储环境变量”。 - Max MacLeod

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接