iOS組件化開發之路(CTMediator),涉及到cocoapods本地庫、遠程私有庫、遠程公開庫(一)

以下文章為本人研究組件化之后的理解,對于這一路上的種種不明確問題及查詢了好多博客上錯誤的資料,一路采坑過來有了如下總結,如有錯誤,歡迎大神指出。

iOS的組件化分為什么?這里注意是分為,什么,不是分,為什么

這還分為什么么?當然。

其實我們平時使用cocoapods的公開庫也算是組件化的一種。

一、按照存儲方式分

  1. 本地庫
  2. 遠程私有倉庫
  3. 遠程公開倉庫
    自己項目的組件化可以用前兩種(1.本地庫、2.遠程私有倉庫)方式。
    這幾個庫有什么區別呢?

本地庫

項目和索引文件都存儲在你本地,pod之后需要用path配你本地的路徑

遠程私有倉庫

需要給索引文件創建一個倉庫,需要給你封裝的組件創建一個倉庫,將組件打上tag版本關聯到索引的文件

遠程公開倉庫

這個就是我們平時正常引用三方開源框架的方式pod "AFNetworking"啊。。。

二、按照項目結構分

1.單個項目的多個組件
2.多個項目的多個組件

單個項目的多個組件

這個就是你有一個主項目,將登錄、新聞詳情、購物車等等的功能獨立成組件。

多個項目的多個組件

這個就好比有一個項目叫淘寶,你搜索出來一堆天貓的商品,需要跳轉到天貓的商品詳情頁,但是你不能把天貓的代碼粘過來呀,更不能把文件拷貝一份過來呀,這個時候怎么辦呢,不要慌,叫天貓項目的開發人員將他的商品詳情抽成一份組件出來,上傳到遠程倉庫,這個倉庫需要創建成私有的,因為自己寫的項目可不能隨便給公開嘍,你在工程里pod一下,天貓的詳情頁就過來,這個跟公開的庫用法一樣,其實在項目里直接#import <TmallDetailViewController.h>就可以用了,沒毛病。但是,看好了啊,但是來了,這樣是不是兩個工程就關聯上了,這不是我們想要的啊,我們想要的是解耦,將耦合度將到最低最低,此時就要用到CTMediator這個三方庫了,用這個路由將兩個項目解耦。
理論就說到這里,下面開始實踐
等等落了句話,其實按照項目結構分的“單個項目的多個組件”和“多個項目的多個組件”只是叫法上不一樣,他們在實踐上是一樣的,因為登錄、新聞詳情他們抽出來的單個組件也是在一個獨立的項目中,這也是一個單獨的項目,只是沒有它的主功能罷了。
下面開始真的實踐了


這里我只需要講:本地庫 + 路由到頁面和遠程私有庫 + 路由到頁面這兩個組件化模式。
下面開始操作


好多博客里面都是用 pod lib create 這種直接創建模板工程的方式去創建,但是我不喜歡這樣,對于本來不熟的人操作就夠亂套的了在加上這一手會更加亂套。

一、本地庫創建 + 組件化

1. 首先創建一個空文件夾這里我們起名ShoppingProject,用來容納我們的主工程和組件工程,放到一起不亂套。
image.png
2. 創建主工程
image.png

版本號這塊要注意一下,所有工程的版本號要設置成一樣的,包括一會我們創建的索引文件也要設置成一樣的,這里我選的iOS10.0


image.png
3. 工程基礎代碼設置一下還有證書什么的自己配置一下,保證工程可以跑起來

創建好之后應該是這樣的


image.png

image.png

模擬器應該是這樣的


image.png
4. 創建組件工程,這里我們做登錄的組件頁LoginComponent
image.png

此時創建完成你的ShoppingProject文件夾應該是這樣的


image.png
5. 配置一下工程的版本號證書及基本設置等等
6. 新建LoginViewController文件夾,繼承UIViewController的控制器
image.png
7. 設置Appdelegate.m和LoginViewController.m文件
image.png

image.png

跑起來的模擬器


image.png
8. 新建Targets文件夾,繼承NSObject創建一個類,名字先跟我起一樣的這個地方在路由有映射,所以名字一定要對應取好,這個就是組件工程為主工程開放出來的接口
image.png
9. Target_Login中的代碼
image.png

image.png

主工程和組件工程到此就整完了,下面我們開始創建CTMediator的分類工程,這個工程是用來連接主工程與組件工程的橋梁,是我們實現工程解耦的關鍵一步

10. 創建LoginComponent_Category工程
image.png

創建好后的工程目錄


image.png
11. 配置版本號和證書描述文件啦 等等。。。
12. 配置好后關閉工程,打開終端,我們要為LoginComponent_Category工程通過cocoapods引入三方框架CTMediator

進入到LoginComponent_Category工程目錄

$ touch Podfile

編輯Podfile文件

platform :ios, '10.0'

target 'LoginComponent_Category' do
    pod 'CTMediator'
end
$ pod install
13. 使用LoginComponent_Category.xcworkspace打開工程,創建對應文件夾及CTMediator的分類

image.png

CTMediator+Login.h和CTMediator+Login.m中的代碼
image.png

image.png

這個地方就是這么映射的
image.png

三個項目到這里就差不多了,下面我們開始配置podspec,這個就是用來創建pod索引的,有了這個文件才能被別的項目pod進去

14. 打開終端進入LoginComponent工程的根目錄

創建索引依賴文件

$ pod spec create LoginComponent

執行之后會在你的工程目錄里多出這么一個文件


image.png

LoginComponent.podspec文件配置

Pod::Spec.new do |spec|
  spec.name         = "LoginComponent"
  spec.version      = "0.0.1"
  spec.summary      = "A short description of LoginComponent."
  #spec.homepage     = "http://EXAMPLE/LoginComponent"
  spec.author             = { "Cloud" => "haohao10987@163.com" }
  spec.platform     = :ios, "10.0"
  #spec.source       = { :git => "http://EXAMPLE/LoginComponent.git", :tag => "#{spec.version}" }
  spec.source_files  = "LoginComponent/LoginComponent/LoginViewController/**/*.{h,m}", "LoginComponent/LoginComponent/Targets/**/*.{h,m}"
end

看到下圖中兩個畫框的文件位置了嗎,我們要為這兩項配置去創建一個遠程的倉庫,因為是本地庫嘛,我也不想創建,但是這兩項不填寫正確的在pod install的時候會報錯,所以我們需要為它創建一個遠程倉庫,這里我們創建一個私有的遠程倉庫,對了,遠程倉庫我用的碼云(這里的遠程私有倉庫和前面說的遠程私有庫 + 路由這種配置方法沒關系,這里我們只是用了一下庫的鏈接,真正要用到私有庫還需要為私有庫配置spec的工程和關聯索引,不理解沒關系,一會我講遠程私有庫 + 路由的時候再去理解)


image.png

倉庫的使用我這里不多做介紹,創建好后自己把項目關聯好,在上圖紅框的位置填入相應鏈接


image.png

傳完之后我的項目目錄結構就變成這樣子的了
image.png

修改LoginComponent.podspec文件


image.png
15. 修改Shopping工程的Podfile文件
image.png

這塊是方便你復制粘貼的

platform :ios, '10.0'

target 'Shopping' do
    pod 'LoginComponent', :path => "../LoginComponent"
end
16. 終端進入到Shopping文件夾,執行
$ pod install

緊接著在Development Pods就會出現我們的Pods項目中(跟公開庫直接在Pod文件夾中不太一樣)


image.png

到此為止,組件工程已經被我們引入到主工程中了,但是為了解耦,主工程和組件工程不可以直接相互調用,下面我們開始制作“LoginComponent_Category”這個分類組件工程的本地庫,然后引入到主工程中。

17. 有了上一次的經驗我們先為“LoginComponent_Category”分類組件工程創建它的遠程私有倉庫
image.png

這是關聯好之后的目錄層級


image.png
18. 打開終端,為“LoginComponent_Category”分類組件工程創建podspec項目依賴索引文件

進入到LoginComponent_Category根目錄

$ pod spec create LoginComponent_Category

創建好之后的樣子


image.png
19. 配置LoginComponent_Category.podspec文件
image.png

沒錯,下面這段是方便你復制粘貼的

Pod::Spec.new do |spec|
  spec.name         = "LoginComponent_Category"
  spec.version      = "0.0.1"
  spec.summary      = "A short description of LoginComponent_Category."
  spec.homepage     = "https://gitee.com/moment_forever/LoginComponent_Category"
  spec.author             = { "Cloud" => "haohao10987@163.com" }
  spec.platform     = :ios, "10.0"
  spec.source       = { :git => "https://gitee.com/moment_forever/LoginComponent_Category.git", :tag => "#{spec.version}" }
  spec.source_files  = "LoginComponent_Category/LoginComponent_Category/LoginComponent_Category/**/*.{h,m}"
  spec.dependency "CTMediator"
end
20. 在主工程的Podfile文件里配置
platform :ios, '10.0'

target 'Shopping' do
    pod 'LoginComponent', :path => "../LoginComponent"
    pod 'LoginComponent_Category', :path => "../LoginComponent_Category"
end
21. 終端進入Shopping主工程文件夾執行
$ pod install

接下來打開我們的主工程就會看到


image.png
22. 緊接著修改我們的主控制器
image.png
23. 最后運行模擬器跑起來,在首頁點擊view空白處會跳轉到登錄頁
image.png

至此,iOS使用本地庫進行組件化開發就已經結束了,這個組件化適合用在什么工程中呢

  • 單人開發單項目,將功能組件化。
  • 單人開發多項目,將公用的功能組件化。
  • 多人開發單項目,將功能組件化。
  • 多人開發多項目,將公用的功能組件化。
    這里我要強調一下“多人開發多項目”,當多個人開發多個項目時會有兩種情況:一個是多個人每個人都有權限去開發所有項目;第二個多個人開發多個項目,每個人只有權限去開發自己的項目,但是這幾個項目中還是有公共的模塊或者組件需要抽出來,這就不適合使用本地化的組件了,由此引出了“遠程私有庫 + 路由進行組件化開發”,我決定再寫一篇文章去記錄,兩項內容寫在一篇博客里面實在是太長了
    iOS組件化開發之路(CTMediator),涉及到cocoapods本地庫、遠程私有庫、遠程公開庫(二)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374