Ios 在Xcode中为不同环境组织API基URL的最佳方法

Ios 在Xcode中为不同环境组织API基URL的最佳方法,ios,objective-c,xcode,xcode5,Ios,Objective C,Xcode,Xcode5,我们的API有3个环境Dev、Stage和Prod。我在Xcode中为3个环境设置了3个目标和方案,它们具有不同的构建、代码签名、概要文件和plist 如何对API基URL执行相同的操作?现在我有一个前缀文件。因为它是一个项目,所以所有3个目标都使用同一个文件,每次为不同的环境构建时,我都必须更改注释 //DEV #define SERVER_URL @"http://api.dev.com/api/" //STAGE #define SERVER_URL @"http://api.stage.

我们的API有3个环境
Dev、Stage和Prod
。我在Xcode中为3个环境设置了3个目标和方案,它们具有不同的构建、代码签名、概要文件和plist

如何对API基URL执行相同的操作?现在我有一个前缀文件。因为它是一个项目,所以所有3个目标都使用同一个文件,每次为不同的环境构建时,我都必须更改注释

//DEV
#define SERVER_URL @"http://api.dev.com/api/"
//STAGE
#define SERVER_URL @"http://api.stage.com/api/"
//PROD
#define SERVER_URL @"http://api.prd.com/api/"
在Xcode中为不同的目标环境组织API基URL的最佳方法是什么


谢谢,

对于每个目标,您可以添加不同的预处理器宏(位于目标的生成设置中)。例如,您的开发目标定义了
Dev=1

DEBUG
宏是一个很好的例子,应该存在于每个目标中的调试配置中。您必须为每个配置(调试、发布等)指定自定义预处理器宏

在前缀头文件中,您现在可以检查当前正在构建的目标

#if defined DEV
  #define SERVER_URL @"http://api.dev.com/api/"
#elif defined STAGE
  #define SERVER_URL @"http://api.stage.com/api/"
#elif defined PROD
  #define SERVER_URL @"http://api.prd.com/api/"
#endif

我认为它应该是这样工作的,但不要把我限制在这一点上。

首先,对于如此复杂的事情,我强烈建议使用xcconfig文件而不是构建窗格进行配置。是相当过时的,但信息仍然相当准确(减去Xcode UI中的一些小更改)

使用这种技术,您可以为不同的构建配置(Dev、Stage、Prod)混合使用不同的xcconfig文件。在正确的xcconfig中,您可以使用
GCC\u预处理器\u定义
设置所需的任何宏:

GCC_PREPROCESSOR_DEFINITIONS = SERVER_URL=@"http://api.dev.com/api/"

我到处玩,为我找到了一个简单而有效的解决方案

我将
API基本URL
作为一个值放入每个目标的
plist
,键为
@“ServerURL”
。然后在与API接口的singleton类上,我将其放在init中

NSDictionary* infoDictionary = [[NSBundle mainBundle] infoDictionary];
serverURL = [infoDictionary objectForKey:@"ServerURL"];

在这里,我有一个正确的服务器URL,它基于我正在构建的目标。

目标之间可以有更多的差异(使用或不使用某些框架,…),这使得预处理器宏比.plist值更易于维护