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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM