Xcode 4.3 - 预处理plist不再用#define与“http://”?

时间:2012-02-18 05:00:26

标签: objective-c xcode plist

我刚刚升级到最新的4.3 Xcode。 我有我的plist.which是预处理的,与4.2比较似乎不再有效。

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

我设置

 #define MYSERVER  http://127.0.0.1:1234/

和我的plist

    <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];

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

2 个答案:

答案 0 :(得分:3)

这实际上是clang预处理器中的一个错误,该错误随Xcode 4.3(clang 3.1)一起提供,它影响所有预处理,而不仅仅是Info.plists。我提交了一个错误(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

要恢复此黑客,只需将其重写为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

答案 1 :(得分:0)

您可以考虑跳过预处理器并使用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标记为已修改,并且根据您的需要可能不理想。< / p>