說一下背景
自從這個項目不死不活的迭代了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
