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

53

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

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

6个回答

48

以下是我所做的事情,我不确定这是否符合您的要求:

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

    MY_LANG -> en_us
    
    然后,在预处理宏的设置中,您可以引用该值:
    LANGCODE="$(MY_LANG)"
    
    现在,您可以在所有源文件中引用LANGCODE,并且它将是您填写的自定义构建设置的内容。我知道这里有一定的间接性,但在我的情况下,这是有意为之的:我的XCode项目包含了许多不同的目标/配置,它们都有自己的预处理器宏。我不想进入所有这些内容,只是为了更改语言代码。事实上,我在项目级别上定义了语言代码。我还在一些脚本中使用MY_LANG,因此仅使用预处理器宏是不够的。可能有更聪明的方法,但这对我来说有效。

2
好的,我可以按照前两个步骤进行操作,但是我无法理解第三步中所说的预处理器宏设置。我尝试按照https://dev59.com/v3RC5IYBdhLWcg3wP-Zh中描述的方法将其添加到GCC_PREPROCESSOR_DEFINITIONS中,但是没有起作用。 - gebirgsbärbel
6
另一种方法是在创建用户设置后,转到“Build Phases”选项卡,然后对于打算读取设置的源文件,添加:-D'LANGCODE=@"$(MY_LANG)"'。请注意,该翻译保留了原文中的技术术语和代码,以便更准确地传达原意。 - Aleks N.
4
如果你在构建设置中为一个字符串定义了宏,不要忘记转义引号,就像这样:LANGCODE=@\"$(MY_LANG)\" - DanSkeel
1
在需要将修订版本作为字符串的构建设置中,以下内容对我有效:VERSION_REV=\"000000\" 感谢@DanSkeel的提示,这很有帮助。 - RobLabs

43

你可以在运行时访问自定义的构建设置(如@JWWalker的评论所建议的)

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

MySetting -> ${MYSETTING}
  • 从代码中读取它的值

    Objective-C

  • [[NSBundle mainBundle] objectForInfoDictionaryKey:@"MySetting"];
    

    [编辑] Swift

    guard let mySetting = 
      Bundle.main.object(forInfoDictionaryKey: "MySetting") as? String 
        else { print("MySetting not found") }
    

    1
    有没有一种方法可以在不向Info.plist添加条目的情况下访问用户定义的设置? - Vinicius Bazanella

    23

    Swift 4

    假设“filename”是你在应用程序中需要的字符串。

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

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

    然后在Swift代码中:

    if let filename = Bundle.main.infoDictionary?["filename"] as? String {
        // do stuff with filename
    } 
    else {
        // filename wasn't able to be casted to String
    }
    

    2
    这个可行!Swift 4.2(Xcode 10.0)。别像我一样忘了第二步,需要修改Info.plist。 - jcislinsky
    到目前为止,这是我找到的最简单的解决方案。 - River2202
    非常好的方法。运行良好,而且是迄今为止最适合Swift的解决方案! - metatheoretic
    1
    你真的不应该在这里强制转换为字符串。我改变了代码,使其成为一个带有else语句的可选项。 - Ethan Allen
    我在这里使用了if-let,但是guard-let也可以。 - Ethan Allen

    9
    您的代码无法读取任意构建设置。您需要使用预处理器宏。
    编辑:例如,在“Debug”配置的目标设置中,您可以在“预处理器宏”构建设置中添加DEBUGGING=1,并在“Release”配置中不定义DEBUGGING。然后,在您的源代码中,您可以执行以下操作:
    #if DEBUGGING
      use this file
    #else
      use the other one
    #endif
    

    1
    谢谢,JWWalker,你能向我展示如何为Xcode项目定义预处理器宏吗? - The Lazy Hiker
    好的,我在我的回答中添加了一个例子。 - JWWalker
    4
    附言:有一种使用用户定义设置的方法:勾选“在Info.plist文件中展开构建设置”,然后您可以在Info.plist文件中使用$MYSETTING - JWWalker

    6

    我尝试了zmippie的建议,但对我来说没有起作用。

    我用以下方法使其工作:

    ${MY_LANG}
    

    0

    如果还有人在寻找如何使用预处理器宏的方法,请查看Build Settings中的Apple LLVM - Preprocessing部分。在此部分下,您将看到一个名为Preprocessor Macros的部分。

    这是Xcode默认插入DEBUG=1宏以进行调试构建配置的地方。

    您可以在此处添加自己的宏,并为调试、发布和任何自定义构建配置提供不同的值。

    要添加一个宏,请双击所需配置的当前值列表,它将显示一个漂亮的小编辑器,每行一个宏。只需添加自己的宏名称,并像DEBUG一样给它一个值即可。

    可以使用#if、#ifdef等来检查这些内容,在预处理器构建阶段提供条件代码或值。

    希望这能帮到您。


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