Xcode 构建环境

Xcode build for environment

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

我想知道定义这些 url 并根据我们要构建的环境在它们之间切换的最佳约定是什么。这是我可以在我的构建设置中定义的东西,还是我可以使用定义来设置各种构建来指定环境?

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

这对我有用:

#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" 和 "Release" 中添加 TARGET_PROD,TARGET_TEST 用于目标测试,TARGET_VAL用于目标分期。 当您发出请求时,只需在您的 BASE_URL 中附加 SERVICENAME,如下所示:

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

使用NSUserDefaults

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

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

NSUserDefaults 按特定顺序搜索域以查找值。 this post by oleb.

中对此行为进行了很好的解释

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