【问题标题】:How can I access a user-defined Xcode build setting?如何访问用户定义的 Xcode 构建设置?
【发布时间】:2011-04-27 12:04:55
【问题描述】:

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

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

【问题讨论】:

    标签: objective-c xcode


    【解决方案1】:

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

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

      MY_LANG -> en_us
      
    3. 然后,在预处理器宏的设置中,您可以引用该值:

      LANGCODE="$(MY_LANG)"
      

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

    【讨论】:

    • 好的,我可以按照前两个步骤进行操作,但是我无法弄清楚第三步中预处理器宏设置的含义。我尝试按照stackoverflow.com/questions/367368/… 中的说明将其添加到 GCC_PREPROCESSOR_DEFINITIONS 中,但是这不起作用
    • 另一种方法是在您创建用户设置后,转到“构建阶段”选项卡,对于要读取该设置的源文件,添加:-D'LANGCODE=@"$(MY_LANG)"'
    • 如果您在构建设置中为 string 定义宏,请不要忘记像 LANGCODE=@\"$(MY_LANG)\" 那样转义引号
    • 这在构建设置中对我有用,因为它需要是一个字符串:VERSION_REV=\"000000\" 感谢@DanSkeel 提供的帮助。
    【解决方案2】:

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

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

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

      目标-C

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

      [编辑] 斯威夫特

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

    【讨论】:

      【解决方案3】:

      斯威夫特 4

      假设“文件名”是您在应用中需要的字符串。

      将 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
      }
      

      【讨论】:

      • 这行得通!斯威夫特 4.2 (Xcode 10.0)。不要像我一样忘记 Info.plist 的第二步。
      • 有效,到目前为止我找到的最简单的解决方案。
      • 优秀的方法。效果很好,是迄今为止对 Swift 最友好的解决方案!
      • 你真的不应该在这里强制转换为字符串。我更改了代码,使其成为可选的 else 语句。
      • 我在这里使用了 if-let,但是 guard-let 也可以。
      【解决方案4】:

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

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

      #if DEBUGGING
        use this file
      #else
        use the other one
      #endif
      

      【讨论】:

      • 谢谢,JWWalker,您能告诉我如何专门为 xcode 项目定义预处理器宏吗?
      • 好的,我在答案中添加了一个示例。
      • P.S.使用自定义设置有一种方法:勾选“Expand Build Settings in Info.plist File”,然后可以在Info.plist文件中使用$MYSETTING
      【解决方案5】:

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

      我得到了它的工作:

      ${MY_LANG}
      

      【讨论】:

        【解决方案6】:

        如果其他人仍在寻找如何执行预处理器宏,请在构建设置中查找 Apple LLVM - 预处理部分。在它下面,您将看到一个名为 Preprocessor Macros 的部分。

        这是默认情况下 Xcode 为调试构建配置插入 DEBUG=1 宏的地方。

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

        要添加一个,双击你想要的配置的当前值列表,它会显示一个漂亮的小编辑器,每行都有一个宏。只需添加您自己的宏名称,并以与 DEBUG 相同的方式为其赋值。

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

        希望对您有所帮助。

        【讨论】:

          猜你喜欢
          • 2012-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-10
          • 2016-02-05
          • 1970-01-01
          相关资源
          最近更新 更多