xcode多target管理不同的环境(pod多target配置)
说一下背景
自从这个项目不死不活的迭代了2年,从项目搭建到现在,一直都是自己在开发和维护,所以项目结构非常清晰,但是之前的水平写的代码现在看来也是惨不忍睹,不过本人比较懒,也就没有考虑过重构的事情 - - 是不是一位不合格的程序员呢,哈哈哈!
这个项目中开始是用oc写的,今年开始,由于喜欢上了swift,所以导致这次的迭代使用了swift开发,所以项目目前应该算是oc和swift混编(也没看到swift编译快到哪里去呀?),如何混编,这里就不多赘述了,百度搜一下很多,总结一下,大致就两点:
1.swift调用oc的代码,需要使用“桥接文件”,桥接文件基本上在你创建swift代码的时候会提示你创建,桥接文件里导入的是在swift代码中要使用到的oc代码。
桥接文件的配置路径在BuildSettings 中搜索 Swift
只要路径正确,配置完成后,在桥接文件里引入swift代码中要使用的oc库即可。
2. oc代码调用swift代码文件。 在创建swift文件的时候,系统会自动创建一个 "productName-Swift.h"的文件,productName就是项目名,在要使用swift代码文件的地方 引入即可。这个文件是找不到的,但实际上是存在的。
--------------------------分割线-------------------------
以上是项目的背景,下面要说到使用targets了
在这个项目之前,从来没有使用过targets,不是懒 而是因为之前的项目没这个必要
但是这次客户有一个需求,这个app需要有一个内部版本,内部版本开放一些特殊的功能,而线上版本没有,所以才考虑使用targets来配置一下两种环境。
如果在相同代码或者90%代码不变的情况下,有部署多端或者部署多个环境的要求下,建议还是使用targets来管理,很方便。
1.创建targets
这个不多说,很简单,单击目前已有的targets,选择“Duplicate”,复制一个相同环境的tagets,然后修改tagets名称。 然后 Manage Schemes,
将两个tagets都选上,这样打包或者debug的时候,就可以选择不同的环境配置了
2.配置内部版target
上面第一步创建好了targets后,需要对这个targets进行配置,首先就是在BuildSettings中搜索 “preprocessing”,设置一个内部环境独有的宏 kTargetInternal,这样就可以在代码中使用此宏了。
除了配置宏,还要配置info.plist。在上面的步骤中,当我们重新"Duplicate'一个targets的时候,也会重新生成一个plist文件,buildsetting搜索 'Packaging'
OK,配置结束,这个时候运行基本上没问题,你可以在这个targets中配置属于这个环境独有的图片,启动图等等。
一定要注意一下,如果你是用oc和swift混编的话,注意这里:
由于不管有几个targets,在创建swift文件的时候,会默认生成一个productName-Swift.h的文件,所以这里一定不要配 $(TARGET_NAME)-Swift,这样会使你的程序报错,会提示你找不到xxxswift文件。不管在哪个targets中,一定要写死,
=------------------------------------------------------------------------------------------------------------------------------------------------------------
以下说一下
一个工程多个target引入CocoaPods的方式
(推荐)方式一:通过abstract方式引入
#targetA: [AFNetworking,Masonry] #targetB:[AFNetworking,SDWebImage] abstract_target 'abstract_pod' do #这里的abstract_pod在实际targets中不存在,是虚拟 pod 'AFNetworking' target 'targetA' do pod 'Masonry' end target 'targetB' do pod 'SDWebImage' end end
方式二:循环target 添加pod
#多个target的pod引入,方式一:如每个pod都引入masonry targetArray = ['target1','target2'] targetArray.each do |t| target t do pod 'Masonry', '~> 1.1.0' end end
方式三:提取公共pods 各个target引入
#多个target的pod引入,方式二:如每个pod都引入masonry def commonPods pod 'Masonry', '~> 1.1.0' end #工程一: target 'AnyDoorDemo' do commonPods pod 'AFNetworking', '~> 3.2.1' target 'AnyDoorDemoTests' do inherit! :search_paths pod 'Specta', '~> 1.0.7' pod 'OCMock', '~> 3.4.2' pod 'Expecta', '~> 1.0.6' end target 'AnyDoorDemoUITests' do inherit! :search_paths # Pods for testing end end #工程二: target 'HostApp' do commonPods end
模板样例
#添加索引库索引文件地址 source 'https://github.com/LGLee/MySpaces.git' source 'https://github.com/CocoaPods/Specs.git' platform :ios, '9.0' #多个target的pod引入 def commonPods pod 'Masonry', '~> 1.1.0' end #工程一: target 'AnyDoorDemo' do commonPods pod 'AFNetworking', '~> 3.2.1' #测试相关↓ target 'AnyDoorDemoTests' do inherit! :search_paths pod 'Specta', '~> 1.0.7' pod 'OCMock', '~> 3.4.2' pod 'Expecta', '~> 1.0.6' end target 'AnyDoorDemoUITests' do inherit! :search_paths # Pods for testing end end #工程二: target 'HostApp' do commonPods end