Xcode使用方案来确定开发/暂存/生产服务器URL

时间:2013-12-31 21:59:59

标签: ios objective-c xcode

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

我希望为每个Xcode创建一个方案,其中Xcode将注入正确的URL。我是否复制了运行方案并添加了环境变量?这是最好的做事方式,我不特别希望在我的服务器类中使用#ifdef并在每次更改服务器时将其设置为代码。有人能指出我正确的方向吗?

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

[编辑]每个人都提出了一些很好的建议,但我觉得@ redent84的答案最适合我的需要。虽然我发现有趣的是没有人真正建议使用不同的方案。 [/编辑]

3 个答案:

答案 0 :(得分:10)

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

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

如果网址是硬编码的,只需添加#ifdef指令即可选择网址:

#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

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

答案 1 :(得分:5)

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

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

修改

您必须拥有多个目标。每个目标应指向不同的.plist文件。看到: How to configure independent sets of runtime settings in XCode

答案 2 :(得分:0)

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