问题描述
我有三个API
,它们具有不同的API Keys
和一些不同的设置
I've three API
with different API Keys
and some different settings
-
用于开发或内部测试构建-iOS App Store外部的开发发行版
For development or internal testing build - Development distribution outside the iOS App Store
-
Host
-devapi.project-name.com -
API Key
-development_key -
FLEX
[ 1 ]-启用
Host
- devapi.project-name.comAPI Key
- development_keyFLEX
[1] - Enable
用于客户端测试版本-iOS App Store外部的企业发行版
For client testing build - Enterprise distribution outside the iOS App Store
-
Host
-stgapi.project-name.com -
API Key
-enterprise_key -
FLEX
-启用
Host
- stgapi.project-name.comAPI Key
- enterprise_keyFLEX
- Enable
用于生产构建-在iOS App Store中分发
For production build - Distribution in the iOS App Store
-
Host
-API.project-name.com -
API key
-app_store_key -
FLEX
-禁用
Host
- API.project-name.comAPI key
- app_store_keyFLEX
- Disable
我可以使用DEBUG
#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
-
用于企业发行
#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
我正在寻找类似这样的方式
I'm looking for way something like this
#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
还是其他?
有什么方法可以创建三个名称不同的构建而不创建不同的目标?
Is there any way to create three build with different name without creating different target?
-
ProductName
-适用于App Store -
ProductName-Dev
-用于内部开发版本 -
ProductName-Stg
-用于客户端测试(企业)版本
ProductName
- For App StoreProductName-Dev
- For Internal Development buildProductName-Stg
- For Client Testing (Enterprise) build
我刚刚根据 iamnichols 提供的解决方案创建了演示项目和完整的视觉指南>
I've just created demo project and full visual guide based on solution give by iamnichols
- Best way to manage Development, Testing and Production iOS builds with different settings
- https://github.com/vineetchoudhary/BuildManagement
推荐答案
调试和发布版本之间的区别在于,其中一个已归档并导出,而另一个通过调试器中的Xcode在本地运行.您可能会发现有时也想在调试器中运行生产或暂存版本,但是通过#ifdef DEBUG
拆分内容,您可能会遇到问题.
The difference between a debug and a release build is that one is archived off and exported but the other is run locally via Xcode in the debugger. You might find that you want to sometimes run the production or staging build in the debugger too but by splitting stuff out by #ifdef DEBUG
, you are probably going to run into issues.
这是我所做工作的简化版本:
This is a simplified version of what I do:
在项目(而非目标)设置中,创建(与原始副本相同)以下配置:
In the project (not target) settings, create (duplicate from the originals) the following configurations:
- Debug_Dev
- Debug_Staging
- Debug_Prod
- Release_Dev
- Release_Staging
- Release_Prod
请注意,如果您使用Cocoapods,则需要将配置设置回无,删除项目中Pods文件夹的内容(不是Pods项目),然后重新运行.
Note that if you use Cocoapods then you will need to set the configurations back to none, delete the contents of the Pods folder in your project (Not the Pods project) and re-run pod install
.
创建以下内容(而不是使用MyApp方案)(复制原始内容):
Instead of just having a MyApp scheme, create the following (duplicate the original):
- MyApp_Dev
- MyApp_Staging
- MyApp_Prod
在每种方案中,请在适当的地方使用关联的Debug_ *和Release_ *配置.
In each scheme, use the associated Debug_* and Release_* configurations where appropriate.
添加一个附加的预处理器宏,以标识要针对哪个环境构建.
Add an additional preprocessor macro to identify what environment you are building against.
在项目构建设置中,单击+并添加用户定义的构建设置,然后将其命名为MYAPP_ENVIRONMENT
.然后,对于每个不同的环境组,向每个环境添加一个不同的预处理器宏.即ENV_DEV=1
,ENV_STAGING=1
和ENV_PROD=1
.
In the project build settings, click the + and add a user defined build setting and call it something like MYAPP_ENVIRONMENT
. Then, for each different group of environments, add a different preprocessor macro to each one. i.e ENV_DEV=1
, ENV_STAGING=1
and ENV_PROD=1
.
然后,在c预处理器宏中(同样在项目级别而非目标级别),使用$(MYAPP_ENVIRONMENT)
添加此新的MYAPP_ENVIRONMENT设置.
Then, in the c preprocessor macros (again on a project level and not the target level) add this new MYAPP_ENVIRONMENT setting using $(MYAPP_ENVIRONMENT)
.
这样,您就可以像下面这样确定要针对哪个环境进行构建:
This way, you can then determine what environment you are building against like so:
#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
可能要花很多钱,但请告诉我您的情况.
It's probably a lot to take in but let me know how you get on.
然后,您还可以创建不同的用户定义的构建设置来执行不同的操作,例如更改应用程序的显示名称.
You can then also create different user defined build settings to do different things, like change the display name of your app.
您可以通过创建一个名为MYAPP_DISPLAY_NAME
的新设置来做到这一点,例如,为每种配置设置正确的名称,然后在info.plist
中将捆绑显示名称的值设置为$(MYAPP_DISPLAY_NAME)
.
You could do this by creating a new setting called MYAPP_DISPLAY_NAME
for example, set the correct name for each configuration and then in your info.plist
set the value of the Bundle Display Name to $(MYAPP_DISPLAY_NAME)
.
这篇关于使用不同的设置和名称来管理开发,测试和生产版本的最佳方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!