iOS:pipe理开发,testing和生产的最佳方式是使用不同的设置和名称构build

我有三个API与不同的API Keys和一些不同的设置

  • 用于开发或内部testing构build – iOS App Store之外的开发分发

    • Host – devapi.project-name.com
    • API Key – development_key
    • FLEX [ 1 ] – 启用
  • 对于客户端testing构build – 在iOS App Store之外的企业分发

    • Host – stgapi.project-name.com
    • API Key – enterprise_key
    • FLEX – 启用
  • 生产构build – 在iOS App Store中分发

    • Host – api.project-name.com
    • API key – app_store_key
    • FLEX – 禁用

我可以使用DEBUGpipe理两个设置

 #if DEBUG #define API_BASE_URL @"http://devapi.project-name.com/api/v1" #define API_KEY @"development_key" #else #define API_BASE_URL @"http://stgapi.project-name.com/api/v1" #define API_KEY @"enterprise_key" #endif // In AppDelegate.m #if DEBUG [[FLEXManager sharedManager] showExplorer]; #endif 

但是,第一个问题是企业分布(用于客户端testing)和iOS App Store分发(生产)构build,对于企业和App Store分发,每次需要更改代码

  • 对于企业分布

     #if DEBUG //debug setting #else //enterprise setting #define API_BASE_URL @"http://stgapi.project-name.com/api/v1" #define API_KEY @"enterprise_key" #endif 
  • 对于App Store分配

     #if DEBUG //debug setting #else //app store setting #define API_BASE_URL @"http://api.project-name.com/api/v1" #define API_KEY @"app_store_key" #endif 

我正在寻找这样的方式

 #ifdef DEVELOPMENT #define API_BASE_URL @"http://devapi.project-name.com/api/v1" #define API_KEY @"development_key" #elif ENTERPRISE #define API_BASE_URL @"http://stgapi.project-name.com/api/v1" #define API_KEY @"enterprise_key" #elif APP_STORE #define API_BASE_URL @"http://api.project-name.com/api/v1" #define API_KEY @"app_store_key" #endif 

还是其他?


第二个问题

有没有办法用不同的名字创build三个版本而不创build不同的目标?

  • ProductName – 用于App Store
  • ProductName-Dev – 用于内部开发构build
  • ProductName-Stg – 用于客户端testing(Enterprise)构build

我刚刚创build了基于iamnichols给出的解决scheme的演示项目和完整的视觉指南

pipe理开发,testing和生产的最佳方式iOS以不同的设置构build

https://github.com/vineetchoudhary/BuildManagement

debugging和发布版本之间的区别是,一个是存档和导出,而另一个是在debugging器中通过Xcode在本地运行。 您可能会发现,您希望有时在debugging器中运行生产或临时构build,但是通过#ifdef DEBUG分解出来的东西,您可能会遇到问题。

这是我所做的简化版本:

创build单独的configuration

在项目(不是目标)设置中,创build(从原件复制)以下configuration:

  • Debug_Dev
  • Debug_Staging
  • Debug_Prod
  • Release_Dev
  • Release_Staging
  • Release_Prod

请注意,如果使用Cocoapods,则需要将configuration设置为none,删除项目中Pods文件夹的内容( 不是Pods项目 ),然后重新运行pod install

为每个环境创build一个scheme

而不是只有一个MyApp计划,创build以下(复制原始):

  • MyApp_Dev
  • MyApp_Staging
  • MyApp_Prod

在每个scheme中,在适当的地方使用关联的Debug_ *和Release_ *configuration。

添加预处理器macros以识别环境

添加一个额外的预处理器macros,以确定您正在构build的环境。

在项目构build设置中,单击+并添加用户定义的构build设置,并将其称为“ MYAPP_ENVIRONMENT 。 然后,为每个不同的环境组添加一个不同的预处理器macros。 即ENV_DEV=1ENV_STAGING=1ENV_PROD=1

然后,在c预处理器macros(再次在项目级而不是目标级),使用$(MYAPP_ENVIRONMENT)添加这个新的MYAPP_ENVIRONMENT设置。

这样,您就可以确定您正在构build的环境如下:

 #ifdef ENV_DEV NSString * const MyAppAPIBaseURL = @"https://api-dev.myapp.com/"; #elif ENV_SAGING NSString * const MyAppAPIBaseURL = @"https://api-staging.myapp.com/"; #elif ENV_PROD NSString * const MyAppAPIBaseURL = @"https://api.myapp.com/"; #endif 

这可能是很多,但让我知道你如何继续。


然后,您也可以创build不同的用户定义的构build设置来完成不同的操作,例如更改应用的显示名称。

例如,您可以通过创build一个名为MYAPP_DISPLAY_NAME的新设置来实现此MYAPP_DISPLAY_NAME ,为每个configuration设置正确的名称,然后在您的info.plist中将Bundle Display Name的值设置为$(MYAPP_DISPLAY_NAME)

一个更简单,不太复杂的解决scheme将使用不同的头文件为每个configuration,并#importing只有其中之一。 这不是自动的,但它很简单:

 // You only need to switch the following lines when passing from qa 2 production and back: #import "Mode_QA.h" //#import "Mode_Production.h"