如何访问用户定义的Xcode构建设置?

Sup*_*Cat 34 xcode objective-c

如果我在构建配置中添加了用户定义的设置,我如何在Objective-C代码中读取该设置?

我的项目中有两个文件,debug.plist并且release.plist.我希望我MainApp.m的文件根据正在运行的构建配置读取其中一个文件.我在Debug和Release配置中设置了一个名为"filename"的用户定义设置,指向相应的文件.但我不知道我的MainApp.m文件如何从当前运行的配置中读取filename变量.

zmi*_*pie 38

这就是我所做的,我不能100%确定这是你所追求的:

  1. 进入构建设置面板,然后选择左下角的齿轮图标:添加用户定义的设置
  2. 创建用户定义的设置,例如:

    MY_LANG -> en_us
    
    Run Code Online (Sandbox Code Playgroud)
  3. 然后,在预处理器宏的设置中,您可以引用该值:

    LANGCODE="$(MY_LANG)"
    
    Run Code Online (Sandbox Code Playgroud)

现在,您可以在所有源文件中引用LANGCODE,它将是您在自定义构建设置中填写的任何内容.我意识到这里存在一定程度的间接,但在我的情况下这是故意的:我的XCode项目包含一堆具有自己的预处理器宏的不同目标/配置.我不想进入所有这些,只是为了更改语言代码.实际上,我在项目级别定义了语言代码.我也在几个脚本中使用MY_LANG,所以只是预处理器宏不会这样做.可能有一种更聪明的方式,但这对我有用.

  • 另一种方法是在创建用户设置后,转到Build Phases选项卡,对于要读取设置的源文件,添加:`-D'LANGCODE = @"$(MY_LANG)"'` . (6认同)
  • 如果在构建设置中为**字符串**定义宏,请不要忘记转义这样的引号,例如`LANGCODE = @ \"$(MY_LANG)\"` (3认同)
  • 好的,我可以按照前两个步骤进行,但是我无法弄清楚第三步中预处理器宏设置的含义。我尝试将它添加到 GCC_PREPROCESSOR_DEFINITIONS 中,如 http://stackoverflow.com/questions/367368/how-to-define-a-preprocessor-symbol-in-xcode 中所述,但是这不起作用 (2认同)

And*_*per 15

您可以在运行时访问用户定义的构建设置(如@JWWalker的评论中所示)

  1. Info.plist文件中添加一个条目,并将其设置为用户定义的构建设置

    MySetting -> ${MYSETTING}
    
    Run Code Online (Sandbox Code Playgroud)
  2. 从代码中读取它的值

    [[NSBundle mainBundle] objectForInfoDictionaryKey:@"MySetting"];
    
    Run Code Online (Sandbox Code Playgroud)


JWW*_*ker 10

您的代码无法读取任意构建设置.您需要使用预处理器宏.

编辑:例如,在调试配置的目标设置中,您可以添加DEBUGGING=1预处理器宏构建设置,而不是在发布配置中定义DEBUGGING.然后在您的源代码中,您可以执行以下操作:

#if DEBUGGING
  use this file
#else
  use the other one
#endif
Run Code Online (Sandbox Code Playgroud)

  • PS有一种方法可以使用用户定义的设置:选中"在Info.plist文件中展开构建设置",然后可以在Info.plist文件中使用`$ MYSETTING`. (4认同)

Kri*_*ian 10

斯威夫特4

让我们说"filename"是你的应用程序中需要的String.

将filename = YOUR_STRING添加到用户定义的设置(用于调试和发布).

并将filename = $(filename)添加到info.plist.

然后在Swift代码中:

let filename = Bundle.main.infoDictionary?["filename"] as! String
Run Code Online (Sandbox Code Playgroud)

  • 这有效!斯威夫特 4.2(Xcode 10.0)。不要像我一样忘记 Info.plist 的第二步。 (2认同)

Mor*_*ard 6

我尝试了zmippie建议,但它对我不起作用.

我得到了它:

${MY_LANG}
Run Code Online (Sandbox Code Playgroud)