1. 概念区分
-
Xcode Workspace
包含多个Project和其他文档文件
-
Xcode Project
Project就是一个个的仓库,里面会包含属于这个项目的所有文件,资源,以及生成一个或者多个软件产品的信息。
每一个project会包含一个或者多个 targets,而每一个 target 告诉我们如何生产 products。 project 会为所有 targets 定义了默认的 build settings,每一个 target 也能自定义自己的 build settings,且 target 的 build settings 会重写 project 的 build settings。
-
Xcode Target
target 会有且唯一生成一个 Product, 它将构建该 Product 所需的文件和处理这些文件所需的指令集整合进 build system 中。Projects 会包含一个或者多个 targets,每一个 target 将会产出一个 Product。
-
Build Settings
build setting 中包含了 product 生成过程中所需的参数信息。project 的build settings会对于整个project 中的所有targets生效,而target的build settings是重写了Project的build settings,重写的配置以target为准
一个 build configaration 指定了一套 build settings 用于生成某一 target 的 product,例如Debug和Release就属于build configaration。
-
Xcode Scheme
一个Scheme就包含了一套targets(这些targets之间可能有依赖关系),一个configuration,一套待执行的tests。
2. 多环境配置方式
-
利用Build Configuration来配置
-
利用xcconfig 文件来配置多环境
-
利用Targets 来配置多环境
3. 利用 Build Configuratio 配置
1. 新建 Build Configuration
点击Project 找到Configuration,系统默认一个Debug,一个Release。 我们需要选择复制一个 Debug 或 Release。
两者的区别是,Release是不能调试程序,因为默认是屏蔽了可调试的一些参数, 具体可以看BuildSetting里 面的区别,而且Release编译时有做编译优化, 会比用Debug打包出来的体积更小一点。
我们新增一个 Configuration 名字为 Test
注意:刚刚新建完Build Configuration之后,这时如果有pod,请立即执行一下 pod install
2. 新建 Scheme
为新的Configuration新建一个编译Scheme
新建完成后就可以编辑新建的 Schemem,可以把 Run 模式和 Archive 都改成新建的Scheme
注意:如果是使用了Git这些协同工具的可以考虑把刚刚新建的Scheme共享出去,否则其他人看不到这个Scheme。选择“Manage Schemes”
3. 新建 User-defined Build Settings
在 Project的Build Settings里面来,Add User-Defined Setting
然后加入参数,我们可以为不同的环境配置不同的Bundle id 或 ProductName,示例新增 CustomProductName
User-Defined 下面可能还会有 Build_dir 这些目录其实是Pods 自己生成的,之前执行过Pod install 后会自动配置好的,不需要再改动。
4. 修改 info.plist 文件和Images.xcassets
将info.plist里面的Bundle display name修改成我们自定义的字符串。
编译过程中,编译器会根据我们设置好的Scheme去自己选择Debug,Release,Test分别对应的ProductName。
在Images.xcassets里面新添加2个New iOS App Icon,名字最好和scheme的名字相同,这样便于区分。 并在Build Setting中找到 Asset Catalog Compiler 里设置这几种模式下的 App Icon set.
5. 配置并获取环境变量
示例使用GCC 预编译头参数 GCC_PREPROCESSOR_DEFINITIONS
在Build Settings里面找到Apple LLVM Preprocessing,
进一步找到Preprocessor Macros在这里,我们是可以加一些环境变量的宏定义来标识符。
例如可以为Test 新增 EW_TEST 宏
#ifdef EW_DEVELOP
baseURL = @"http:/192.168.2";
#elif EW_TEST
baseURL = @"http://www.baidu.com";
#else
baseURL = @"http://sina.com";
#endif