多Target、元件化實踐

weixin_34146805發表於2017-07-07

前言

因為公司專案的特性:每個城市對應一個APP,每個APP又有著或多或少的區別;

所以開發人員面臨的問題是:開發多個相似APP。

解決方案

先說一下之前的解決方案:

將所有APP整合為一個大的專案,通過修改配置檔案,呼叫不同APP所需程式碼。

這樣確實是解決了問題,但是方案肯定是不好的。

這樣做的缺點:

  1. 任何一個APP都需要載入所有APP的檔案,資源
  2. 每次檢視不同城市的APP都需要修改配置檔案,同時還要修改伺服器地址,很容易發生遺漏
  3. 所有APP的icon,名稱無法單獨設定

下面是本文的解決方案:

  1. 通過Target管理不同城市的APP

    1787055-eb1c4e9a35898cb4.png
  2. 通過cocoapods私有庫將專案元件化

    大家可使用cocoapods私有庫製作指令碼進行私有庫製作。更多cocoapods私有庫製作請點選

  3. 不同的Target匯入不同的cocoapods私有倉庫

project 'SXC.xcodeproj'

platform :ios, '8.0'
use_frameworks!

pod 'QCRouter', :path => '../QCRouter'

target 'SXC_GX' do
  # Pods for SXC-GX
  pod 'SSQ/GX', :path => '../SSQ'
  
end

target 'SXC_HLJ' do
  # Pods for SXC-HLJ
  pod 'SSQ/HLJ', :path => '../SSQ'
  
end

target 'SXC_NX' do
  # Pods for SXC-NX
  pod 'SSQ/NX', :path => '../SSQ'
  
end

target 'SXC_TJ' do
  # Pods for SXC-TJ
  pod 'SSQ/TJ', :path => '../SSQ'

end

target 'SXC_ZJ' do
  # Pods for SXC-ZJ
  pod 'SSQ/ZJ', :path => '../SSQ'

end

注意事項

  1. 多Target使用預定義巨集問題

    1787055-1d26314d60912466.png
    1787055-ae41b8d35e6bc2b1.png

    由於本專案為Swift專案,所以如下使用預定義巨集

    #if SXC_TJ
        let scheme = "sxc-tj"
    #elseif SXC_NX
        let scheme = "sxc-nx"
    #elseif SXC_GX
        let scheme = "sxc-gx"
    #elseif SXC_HLJ
        let scheme = "sxc-hlj"
    #elseif SXC_ZJ
        let scheme = "sxc-zj"
    #else
        let scheme = ""
    #endif
    
  2. 元件化的話,使用了自己開發的QCRouter來進行解耦,思路不知道對不對,大家有什麼好的建議可以提一下。

  3. 建立類的時候要注意選擇正確的Target

    1787055-eaf201e73229d5b3.png

本文demo地址

參考文章

  1. iOS專案中多target的配置
  2. CocoaPods 私有倉庫的建立(超詳細)
1787055-7e652dcb09d62141.png

相關文章