Xcode使用scheme来确定dev / staging / production服务器URL

我希望使用Xcode的scheme来确定运行我的应用程序的服务器。 我有一个从服务器获取信息的应用程序。 像大多数人一样,我有一台开发服务器,一台登台服务器和一台生产服务器。

我希望为Xcode中的每一个都创build一个scheme来注入正确的URL。 我是否重复运行scheme并添加环境variables? 这是做事的最好方法,我不是特别希望在我的服务器类中有#ifdef,并在每次更改服务器时都将其设置为代码。 任何人都可以指出我正确的方向吗?

仅供参考:我正在使用Xcode 5.0.2 iOS7 SDK。

[编辑]每个人都给了一些很好的build议,但我觉得@ redent84答案最适合我的需求。 虽然我觉得有趣的是没有一个实际上build议使用不同的scheme。 [/编辑]

我build议您为每个环境创build不同的XCode目标 。 我build议您更改应用程序的应用程序标识符,例如,生产应用程序将是com.mycompany.App和DEVEL版本将是com.mycompany.App-DEVEL 。 这样,您可以在HockeyApp或TestFlight中分别跟踪应用程序,并且可以同时在同一个设备中同时使用这两个应用程序。

然后,添加为每个目标定义环境的预处理器macros。 DEVEL开发,例如。

如果URL是硬编码的,只需添加一个#ifdef指令来selectURL:

 #ifdef DEVEL #define ENDPOINT_URL @"http://develserver:8080/EndPoint" #elif defined(STAGING) #define ENDPOINT_URL @"http://stagingserver:8080/EndPoint" #else #define ENDPOINT_URL @"http://app.mycompany.com/EndPoint" #endif 

这种方式不太容易分发开发版本,更容易维护,并允许您将自定义代码添加到不同版本。 例如,您可能希望在login屏幕中包含版本号或显示用于开发的警报对话框,但不能用于分发版本。

在plist中使用一个键(对于每个模式,例如:URL_TO_USE),使用define创build一个“快捷方式”来获取值。

  #define MyURL [[NSBundle mainBundle] objectForInfoDictionaryKey:@"URL_TO_USE"] 

编辑

你必须有多个目标。 每个目标应指向一个不同的.plist文件。 请参阅: 如何在XCode中configuration独立的运行时设置集

我通过为每个scheme设置自定义预处理器来处理这个问题。