以下文章為本人研究組件化之后的理解,對于這一路上的種種不明確問題及查詢了好多博客上錯誤的資料,一路采坑過來有了如下總結,如有錯誤,歡迎大神指出。
iOS的組件化分為什么?這里注意是分為,什么,不是分,為什么
這還分為什么么?當然。
其實我們平時使用cocoapods的公開庫也算是組件化的一種。
一、按照存儲方式分
- 本地庫
- 遠程私有倉庫
- 遠程公開倉庫
自己項目的組件化可以用前兩種(1.本地庫、2.遠程私有倉庫)方式。
這幾個庫有什么區別呢?
本地庫
項目和索引文件都存儲在你本地,pod之后需要用path配你本地的路徑
遠程私有倉庫
需要給索引文件創建一個倉庫,需要給你封裝的組件創建一個倉庫,將組件打上tag版本關聯到索引的文件
遠程公開倉庫
這個就是我們平時正常引用三方開源框架的方式pod "AFNetworking"啊。。。
二、按照項目結構分
1.單個項目的多個組件
2.多個項目的多個組件
單個項目的多個組件
這個就是你有一個主項目,將登錄、新聞詳情、購物車等等的功能獨立成組件。
多個項目的多個組件
這個就好比有一個項目叫淘寶,你搜索出來一堆天貓的商品,需要跳轉到天貓的商品詳情頁,但是你不能把天貓的代碼粘過來呀,更不能把文件拷貝一份過來呀,這個時候怎么辦呢,不要慌,叫天貓項目的開發人員將他的商品詳情抽成一份組件出來,上傳到遠程倉庫,這個倉庫需要創建成私有的,因為自己寫的項目可不能隨便給公開嘍,你在工程里pod一下,天貓的詳情頁就過來,這個跟公開的庫用法一樣,其實在項目里直接#import <TmallDetailViewController.h>就可以用了,沒毛病。但是,看好了啊,但是來了,這樣是不是兩個工程就關聯上了,這不是我們想要的啊,我們想要的是解耦,將耦合度將到最低最低,此時就要用到CTMediator這個三方庫了,用這個路由將兩個項目解耦。
理論就說到這里,下面開始實踐
等等落了句話,其實按照項目結構分的“單個項目的多個組件”和“多個項目的多個組件”只是叫法上不一樣,他們在實踐上是一樣的,因為登錄、新聞詳情他們抽出來的單個組件也是在一個獨立的項目中,這也是一個單獨的項目,只是沒有它的主功能罷了。
下面開始真的實踐了
這里我只需要講:本地庫 + 路由到頁面和遠程私有庫 + 路由到頁面這兩個組件化模式。
下面開始操作
好多博客里面都是用 pod lib create 這種直接創建模板工程的方式去創建,但是我不喜歡這樣,對于本來不熟的人操作就夠亂套的了在加上這一手會更加亂套。
一、本地庫創建 + 組件化
1. 首先創建一個空文件夾這里我們起名ShoppingProject,用來容納我們的主工程和組件工程,放到一起不亂套。
2. 創建主工程
版本號這塊要注意一下,所有工程的版本號要設置成一樣的,包括一會我們創建的索引文件也要設置成一樣的,這里我選的iOS10.0
3. 工程基礎代碼設置一下還有證書什么的自己配置一下,保證工程可以跑起來
創建好之后應該是這樣的
模擬器應該是這樣的
4. 創建組件工程,這里我們做登錄的組件頁LoginComponent
此時創建完成你的ShoppingProject文件夾應該是這樣的
5. 配置一下工程的版本號證書及基本設置等等
6. 新建LoginViewController文件夾,繼承UIViewController的控制器
7. 設置Appdelegate.m和LoginViewController.m文件
跑起來的模擬器
8. 新建Targets文件夾,繼承NSObject創建一個類,名字先跟我起一樣的這個地方在路由有映射,所以名字一定要對應取好,這個就是組件工程為主工程開放出來的接口
9. Target_Login中的代碼
主工程和組件工程到此就整完了,下面我們開始創建CTMediator的分類工程,這個工程是用來連接主工程與組件工程的橋梁,是我們實現工程解耦的關鍵一步
10. 創建LoginComponent_Category工程
創建好后的工程目錄
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的分類
CTMediator+Login.h和CTMediator+Login.m中的代碼
這個地方就是這么映射的
三個項目到這里就差不多了,下面我們開始配置podspec,這個就是用來創建pod索引的,有了這個文件才能被別的項目pod進去
14. 打開終端進入LoginComponent工程的根目錄
創建索引依賴文件
$ pod spec create LoginComponent
執行之后會在你的工程目錄里多出這么一個文件
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的工程和關聯索引,不理解沒關系,一會我講遠程私有庫 + 路由的時候再去理解)
倉庫的使用我這里不多做介紹,創建好后自己把項目關聯好,在上圖紅框的位置填入相應鏈接
傳完之后我的項目目錄結構就變成這樣子的了
修改LoginComponent.podspec文件
15. 修改Shopping工程的Podfile文件
這塊是方便你復制粘貼的
platform :ios, '10.0'
target 'Shopping' do
pod 'LoginComponent', :path => "../LoginComponent"
end
16. 終端進入到Shopping文件夾,執行
$ pod install
緊接著在Development Pods就會出現我們的Pods項目中(跟公開庫直接在Pod文件夾中不太一樣)
到此為止,組件工程已經被我們引入到主工程中了,但是為了解耦,主工程和組件工程不可以直接相互調用,下面我們開始制作“LoginComponent_Category”這個分類組件工程的本地庫,然后引入到主工程中。
17. 有了上一次的經驗我們先為“LoginComponent_Category”分類組件工程創建它的遠程私有倉庫
這是關聯好之后的目錄層級
18. 打開終端,為“LoginComponent_Category”分類組件工程創建podspec項目依賴索引文件
進入到LoginComponent_Category根目錄
$ pod spec create LoginComponent_Category
創建好之后的樣子
19. 配置LoginComponent_Category.podspec文件
沒錯,下面這段是方便你復制粘貼的
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
接下來打開我們的主工程就會看到
22. 緊接著修改我們的主控制器
23. 最后運行模擬器跑起來,在首頁點擊view空白處會跳轉到登錄頁
至此,iOS使用本地庫進行組件化開發就已經結束了,這個組件化適合用在什么工程中呢
- 單人開發單項目,將功能組件化。
- 單人開發多項目,將公用的功能組件化。
- 多人開發單項目,將功能組件化。
- 多人開發多項目,將公用的功能組件化。
這里我要強調一下“多人開發多項目”,當多個人開發多個項目時會有兩種情況:一個是多個人每個人都有權限去開發所有項目;第二個多個人開發多個項目,每個人只有權限去開發自己的項目,但是這幾個項目中還是有公共的模塊或者組件需要抽出來,這就不適合使用本地化的組件了,由此引出了“遠程私有庫 + 路由進行組件化開發”,我決定再寫一篇文章去記錄,兩項內容寫在一篇博客里面實在是太長了
iOS組件化開發之路(CTMediator),涉及到cocoapods本地庫、遠程私有庫、遠程公開庫(二)