为什么要多target?
比如现在你公司有一个产品分为普通用户版、VIP用户版、SVIP版等。其实大部分功能是一样的,只不过有一些功能需要成为VIP或者SVIP才能使用,这时候多target就是最佳选择。
简单的说,产品功能类似,只有部分功能需要做不同处理的时候选择使用多target。
为什么要多环境?
一般情况下我们做产品的时候都会有开发接口、测试接口、正式接口等,也就是说在不同情况下使用不同的url去请求数据,这个时候就需要用多环境了。“不同接口”只是一个举例,在做一个产品的时候,不同的情况下会有更多更复杂的不同配置,多环境就能够完美的解决问题。
--------------------------------------------------------------------------------------------------------------------
多target的创建
屏幕快照 2017-06-13 上午10.26.32.png点击 Duplicate就会复制出一份XXX Copy的target,可以看到工程目录中多了一个XXX copy-Info.plist文件,就是这个新target的info.plist,所有的配置都可以在这里进行配置。
创建全新Targets
可用通过菜单Editor->Add Target->Application->Singe View Application->Product Name
来新增
Targets之间异同
- 一个Target包含了Copy Bundle Resources, Compile Sources, Link Binary With Libraries、info.plist等
- Copy Bundle Resources 是指生成的product的.app内将包含哪些资源文件
- Compile Sources 是指将有哪些源代码被编译
- Link Binary With Libraries 是指编译过程中会引用哪些库文件
- 最关键的就是info.plist文件,iPhone项目的很多关键性内容, 比如程序名称, 最终生成product的全局唯一id等都可用info.plist来设置。
- 不同的target还可以定义完整的差异化的编译设置, 从简单的调整优化选项, 到增加条件编译所使用的编译条件, 以至于所使用的base SDK都可以差异化指定
注意事项
- 新增文件、资源时,如果有多个Target,添加新文件时要注意勾选多个Target,要不然就会报错。
- 修改Target名称、修改plist名称、修改schemes
- 修改Bundle Identifier、选择不同证书、一些基本配置进行修改。
设置预编译宏
Target 开发版->Build Settings然后搜索Preprocessor Macros然后增加宏,区别不同target、shemes
多环境创建
1.添加Build Configuration
- 打开项目的workspace,进入Xcode的主界面。选中主要工程的project -> info,找到Configurations, 点击下方的“+”。
- 从图中可以看到两个已经添加好的Configuration: Debug 和 Release,选择“deplicate debug configuration”,添加一个新的configuration,命名为DEV。
- 从图上可以看到,configuration都已经有了默认的configuration set(也就是xxconfig文件)。这是因为我的工程中已经包含了cocoapods。默认的configuration set是pods添加的。
- 这个时候新增加的build configuration并没有对应的pods的xcconfig,所以项目会报错。把新建的configuration 对应的set 设置为none
- 命令行运行 pod install
之后可能会有ld: library not found for -lPods-之类的错误,在target->BulidPhase->Link Binary With Libraries 中将libPod.a删除即解决
- 重要说明:如果没安装cocoapods忽略最后三步
2.新建并配置xcconfig文件
-
command + "n", 选择 iOS -> Other -> Configuration settings file
新建4个xxconfig文件,我采用以下命名:
0C9189D1-2335-4828-AFDE-1BF699A9C693.png
如果是3个target、5种环境就要创建15个xcconfig文件。
-
说明: 在commom.xcconfig中设置所有环境的共同配置,如:
BUILD_VERSION = 1.0.0
在其它xcconfig文件中做如下配置:
//导入公共 config
#include "Common.xcconfig"
//导入pods 对应的 config
#include "Pods/Target Support Files/Pods-DMMutiTargetScheme-DMMutiTargetSchemeBase/Pods-DMMutiTargetScheme-DMMutiTargetSchemeBase.debug.xcconfig"
特别注意:- 可能会因为项目名称的不同导致路径不同,如果不太确定的可以再次pod install。
pods会给出提示,其中包含了正确的路径(文件相对路径)。
APP_DISPLAY_NAME = DEV 特有的配置
- 完成以上后,把build configuration切换成对应的新建的文件
可能会有如下错误:
diff: /../Podfile.lock: No such file or directory
diff: /Manifest.lock: No such file or directory error: The sandbox is not in sync with the Podfile.lock.
Run 'pod install' or update your CocoaPods installation.
这种错误就要查看xcconfig文件中,include的pods文件路径是否正确。
#include "Pods/Target Support Files/Pods-[工程名称]-[target名称]/Pods-[工程名称]-[target名称].[环境名称].xcconfig"
3、设置环境变量
完成上面的步骤就已经添加好了环境,剩下的就是设置环境变量
在Info.plist文件中,设置Bundle name 为
应用的名称就会根据配置改变了。
4.然而在代码中需要根据环境改变某些变量的值怎么办呢?
- 设置预编译头参数
Project -> Build settings -> Apple LLVM 7.1 - Preprocessing
网友评论