Xcode构建环境

时间:2015-01-20 15:20:06

标签: ios xcode environment-variables

目前正致力于连接多个不同网络服务的iPhone应用程序。这些网络服务有几个不同的地址,具体取决于我们连接的环境:

我想知道定义这些网址并根据我们想要构建的环境进行切换的最佳约定。这是我可以在构建设置中定义的内容,还是可以使用define来设置各种构建以指定环境?

注意:不确定这是否重要但目前我们仍在使用纯粹的Objective-c,尽管我们可能会在项目的生命周期中稍后整合Swift。

2 个答案:

答案 0 :(得分:1)

这项工作对我来说:

#ifdef TARGET_PROD
    #define BASE_URL @" http://www.example.com/api/"
#endif
#ifdef TARGET_VAL
    #define BASE_URL @"http://staging.example.com/api/"
#endif

#ifdef TARGET_TEST
    #define BASE_URL @"http://staging.example.com/api/testing/"
#endif

例如,将它放在Commons.h或公共项目文件中。

对于任何目标,请转到构建设置并设置处理器宏,在" Debug"中添加TARGET_PROD。和"发布",TARGET_TEST用于目标测试,TARGET_VAL用于目标测试。 当您提出请求时,只需在您的BASE_URL附加SERVICENAME,如下所示:

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@,%@", BASE_URL,yourService]]];

答案 1 :(得分:0)

使用NSUserDefaults

例如,通过将字典传递给-registerDefaults:,将生产值设置为故障转移默认值。这会将值放在NSRegistrationDomain中。然后,您可以进行验证和测试:

  • 使用代码设置NSArgumentDomain中的值。这会覆盖NSRegistrationDomain
  • 中的值
  • 将值作为启动参数传递。执行此操作时,该值将插入NSArgumentDomain,再次覆盖NSRegistrationDomain中的任何值。

NSUserDefaults按特定顺序搜索域以查找值。 this post by oleb中解释了这种行为。

这种方法很灵活,并没有使用条件编译来解决这个问题的一些缺点。