iOS开发多Target(一):新建Target


在我周围,像我这种性格的人特多——在公众场合什么都不说,到了私下里却妙语连珠,换言之,对信得过的人什么都说,对信不过的人什么都不说。

——王小波《沉默的大多数》

需求1:

需求不同, App分免费版专业版 或者分国内版国际版或者分企业版App Store版
除了个别页面不同, 其他构建页面都完全一样

  • 思考:
    • 第一种:新建两个项目工程开发,把相同的页面封装并拷贝到项目使用
    • 第二种:在同一个项目中,建立两个不同的target进行开发
  • 优劣:
    • 第一种方式:项目之间独立分开,耦合和干扰度小,但是项目开发消耗有点大
    • 第二种方式:节省项目资源拷贝,但是在配置文件和提交到git或者SVN仓库容易冲突

解决方案

  • 使用多Target方式,在原有的基础上面New一个Target

需求2:

App需要应对不同的测试需求:开发环境测试环境预发布环境发布环境

需要不同环境的App可以同时运行,以对比不同版本之间的差异

需要不同环境的App运行后有不同的:App名称图标启动图等等

解决方案

  • 使用多Target方式,在原有的基础上面Duplicate一个Target

Cocoapods需要重新处理

  • 如果项目使用了Cocoapods,那么增加Target后,不管是新建Target或者复制Target都需要处理Podfile文件

方式1

1
2
3
4
5
6
7
8
9
10
11
12
platform :ios, "8.0"

target "MultiTarget" do

workspace 'MultiTarget'
link_with 'MultiTarget', 'MultiTarget_Second'

pod 'ReactiveCocoa', '~> 2.5'
pod 'SVProgressHUD'
pod 'Masonry'

end

方式2 (推荐)

1
2
3
4
5
6
7
8
9
10
11
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
target 'MultiTarget' do
pod 'SVProgressHUD'
pod 'GoogleMaps'
end

target 'MultiTarget' do
pod 'SVProgressHUD'
pod 'BaiduMapKit'
end

项目中新建Target

注意点

  • 以MultiTarget项目为例子,添加一个Target
  • 如果使用Cocoapods管理项目依赖,尽量先把pods初始化后再复制Target
  • 复制Target后需要重新设置Podfile文件的
  • 添加文件和素材的时候注意对应的Target选择
  • 需要手动把另一个Target里面的需要的所有的.m文件和nib文件都在Target Membership 里面勾选
  • 如果有多语言文件也需要在Target Membership 里面勾选
  • 如果配置有pch文件、需要再新建的Target里面重新配置pch文件路径
  • 需要单独配置一些info.plist选项,如网络ATS/权限声明等
  • 需要重新设置一遍依赖Target已经设置过的一些控制面板的属性,如后台,定位,bitcode等

项目新建一个Target

multiTarget_newTarget
multiTarget_newTarget

继承配置

  • 删除不需要的默认生成的文件和xib
  • 修改AppDelegate名称,修改其继承自上一个Target的AppDelegate
  • 修改程序启动调用父类的配置信息
multiTarget_newTarget
multiTarget_newTarget

修改父类AppDelegate文件权限

  • 可以供两个Target访问
multiTarget_newTarget

配置不同的标记

  • 在需要配置的Target中添加标记, 如新增加的Target 添加TARGET_SECOND=1
  • 注意Debug和Release模式都需要配置
multiTarget_newTarget

配置对应的启动图和App图标素材

  • 可以在不同的Targe种配置不同的App图标、启动图、以及其他图标
  • 如果两个Target共用一套图标素材,则在需要共用的Assets.xcassets中的Target Membership中勾选需要共享的Target.
multiTarget_newTarget

重新配置Podfile文件,重新安装依赖库,如

1
2
3
4
5
6
7
8
9
platform :ios, '9.0'

target 'MultiTarget' do
pod 'SVProgressHUD'
end

target 'MultiTarget_Second' do
pod 'SVProgressHUD'
end

项目中实战

  • 删除项目每个Target中的Main interface 中的Main,不需要从XIB中加载,因为第二个Target是和第一个Target初始化入口相同,在Appdelegate中。
  • 需要两个项目共享的.m xib文件都需要Target Membership中勾选需要共享的Target.
  • 在文件中根据设置的Target标记,区分不同的Target
  • 直接切换不同的Target,即可编译生成对应的app
multiTarget_newTarget
multiTarget_newTarget
要不要鼓励一下😘