【问题标题】:Xcode 4.3 - preprocess plist not working anymore for #define with "http://"?Xcode 4.3 - 预处理 plist 不再适用于带有“http://”的#define?
【发布时间】:2012-02-18 05:00:25
【问题描述】:

我刚刚升级到最新的 4.3 Xcode。 我有我的 plist。它经过预处理,与 4.2 相比似乎不再起作用。

我设置了Info.plist other pre-processor 标志-traditional(能够跳过// 视为评论)。

我设置了

 #define MYSERVER  http://127.0.0.1:1234/

在我的列表中

    <key>myhost</key>
    <string>MYSERVER</string>

当我签入新的 Xcode 4.3 时,我看到里面有 NSDictionary *bundle = [[NSBundle mainBundle] infoDictionary];

 myhost = "http:/ /127.0.0.1:1234/"

我有一个快速破解方法。

    NSString *hack = [[[[NSBundle mainBundle] infoDictionary] objectForKey:@"myhost"] stringByReplacingOccurrencesOfString:@" " withString:@""];
    url = [NSURL URLWithString:hack];

这使我的应用程序再次运行,但我想要一个干净的解决方案。有什么想法吗?

【问题讨论】:

标签: objective-c xcode plist


【解决方案1】:

这实际上是 Xcode 4.3 (clang 3.1) 附带的 clang 预处理器中的一个错误,它影响所有预处理,而不仅仅是 Info.plist。我已经提交了一个错误 (LLVM bug 12035, rdar://10883862)。

解决方法是强制 Xcode 4.3 使用 llvm-gcc 进行 Info.plist 预处理而不是 clang。到目前为止,我发现的唯一方法是重写 Info.plist 预处理阶段中使用的“cc”符号链接:

sudo ln -fs /usr/bin/llvm-gcc /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc

要恢复此 hack,只需将其重写为 clang: sudo ln -fs /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc

【讨论】:

  • 感谢您提供此信息。我会继续关注您提交的错误,并希望它会很快得到修复。
  • 另一个不需要替换 cc 符号链接的解决方案是将所有 Info.plist 宏扩展值放在引号中,并在运行时读取值时修剪引号。引用的值将由 clang 的预处理器保留。
  • 谢谢。这类似于(临时)hack :-) NSString *hack = [[[[NSBundle mainBundle] infoDictionary] objectForKey:@"myhost"] stringByReplacingOccurrencesOfString:@" " withString:@""];
【解决方案2】:

您可以考虑跳过预处理器并使用 PlistBuddy。

在构建的脚本阶段这样的事情应该可以工作:

#!/bin/sh

MYSERVER = 'http://127.0.0.1:1234/'

/usr/libexec/PlistBuddy -c "Set :myhost ${MYSERVER}" path/to/Info.plist

请注意,如果您在标准 Xcode 设置中的 ProejctName-Info.plist 上执行此操作,则该文件将在每次构建时被 svn/github 标记为已修改,并且根据您的需要可能并不理想。

【讨论】:

  • 谢谢,但我有很多#define 我使用#if defined .... 在不同环境之间切换。移动到不同的工具不会那么简单。
猜你喜欢
  • 1970-01-01
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多