我该如何在XCode上检查我的iPhone应用程序的TARGET_NAME?

8
我正在尝试在同一个XCode项目中拥有两个版本的iPhone应用程序。代码库几乎相同,我需要有不同行为的地方,我决定使用预处理条件和${TARGET_NAME}标签。
我已将OTHER_CFLAGS设置为包含"-DTARGET_NAME=${TARGET_NAME}"。
然后在我的代码中,我尝试执行:
#if TARGET_NAME == myApp
  NSLog(@"pro");
#elif TARGET_NAME == myAppLite
  NSLog(@"lite");
#endif

很不幸的是,由于TARGET_NAME == myApp始终为真,因为TARGET_NAME已定义,我总是得到"lite"的打印输出。我无法想象如何评估这个字符串比较。

有什么想法吗?

提前感谢。


你的意思不是因为 TARGET_NAME == myApp 总是成立,所以总是打印出 "pro" 吗? - Marty
3个回答

11

您不能在#if块中这样比较字符串。相反,将定义添加到每个特定的目标中。例如,在完整版本的目标上,打开信息面板并转到构建选项卡,然后将类似于FULL_VERSION的内容添加到GCC_PREPROCESSOR_DEFINITIONS构建设置中。然后,对于lite目标,输入类似于LITE_VERSION的内容。在您的代码中,您可以这样做:

#ifdef FULL_VERSION
NSLog(@"Full");
#else
NSLog(@"Lite");
#endif

谢谢,我想我会这样做。一开始我就打算采用这种解决方案,但是我卡在了#if块比较上,因为我在一些博客(比如“这里”:http://www.pacificspirit.com/blog/2009/01/27/building_for_multiple_iphone_targets_in_xcode)中发现了它们,但似乎不可能...再次感谢。 - onigiri

1
实际上,您可以获取目标的名称进行比较,但这不会在编译时跳过其他目标的不必要代码,要做到这一点:
首先,转到菜单产品 -> 方案 -> 编辑方案... (或CMD + <) 然后在参数部分中,添加环境变量的内部内容:

setup environment variables

在你的代码中,你可以通过以下方式获取目标的名称:

NSString *targetName = [[NSProcessInfo processInfo] environment][@"TARGET_NAME"];
NSLog(@"target = %@", targetName); // Will print the target's name

你现在可以在运行时比较该字符串。
但是,根据您的示例:如果要在编译时省略所有Pro版本代码。您应该按照@jason-coco所说的做。并在构建设置中转到预处理器宏,然后添加$(TARGET_NAME)

enter image description here

如果我的目标是“MLBGoldPA”,则# define内的代码将被编译并执行。
#if defined MLBGoldPA
    NSLog(@"Compiling MLBGoldPA");
#endif

-1
要让您的条件评估工作起来,您需要这样做:
#define myApp       1
#define myAppLite   2

提前在你的_Prefix.pch文件中实现。


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