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

ben*_*ink 12 xcode objective-c ios

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

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

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

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

red*_*t84 10

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

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

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

#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
Run Code Online (Sandbox Code Playgroud)

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

  • 我不同意这个答案:我认为目标应该被视为**源文件组**,以便您可以生成不同的"版本",否则它们是相同的应用程序.它不应该用于配置,因为这正是为Xcode配置所做的.它们更轻量级,让您可以像@ redent84的答案一样定义预处理器宏. (9认同)
  • @fatuhoku您应该将答案作为实际答案而不是评论. (3认同)
  • @ redent84是的你完全可以!诀窍是使用用户定义的设置并将其用作捆绑ID末尾的后缀.对不起 - 我应该带领这个链接来证明我的评论.http://blog.chrismiles.info/2011/04/ios-dev-beta-production-builds.html (2认同)

ruf*_*ufo 5

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

  #define MyURL [[NSBundle mainBundle] objectForInfoDictionaryKey:@"URL_TO_USE"]
Run Code Online (Sandbox Code Playgroud)

编辑

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