iOS 模組化架構 (Modular Architecture in iOS) - 上
當面對需求相同或相似的大量 App,例如公司的 40 隻 App 都需要登入功能,
此時使用模組化開發是最適合的,可以大量減少工時,
這裡記錄當初在研究模組化的發展歷程,可以了解以前發生的問題。
這裡直接排除 複製程式碼的共用法,沒有用到實質上相同一份程式碼,就不太算是模組化。
[第一期]:Framework Project
利用原生的方式建立 Framework,並且對它進行版控,他人可以使用或新增功能
建立方式
- 建立一個 Framekwork 專案 ( 例如: TestFrameworkKit )
- 內部建立任意程式碼,並確認可以編譯成功即可,
- (記得使用 Git 進行版控,以確保每個成員使用的版本)
使用方式
- 將 xcodeproj 拉進 App 專案
- 設定專案的 Framework, Libraries, and Embedded Content,加入剛剛的 Framekwork
- 最後 import Framekwork 就可以使用
開發方式
相關應用
🤔【 問題 】
模組無法使用三方(ex.FacebookSDK),專案會發生編譯和 Link 的問題
有以下兩種最常見的方式
Umbrella Framework 的優缺
- [優點]:
- 自由的加入各種 SourceCode 或已編譯 Framework
- [缺點]:
- 官方不推薦使用,理由是 framework 不應包含整個其他的 framework,應保持檔案乾淨
- 做法混亂不一,各個 Xcode 或 iOS 版本做法有些許差距,難以維護並使用….
- 做法冗長複雜,難以加入工作流程,雖然可以用 Script 解決,但也可能有因三方或 Xcode 版本產生其他問題
- 因內部三方被隱藏,而產生版本衝突的隱藏危機
- ex.有個 UmbrellaA 包含 FB framework(v2.0),有個 UmbrellaB 包含 FB framework(v3.0),可能不同版本內部實作有差異,而產生不預期的錯誤。
- 內部三方難更新
Cocoapods Dependency 的優缺
- [優點]:
- 自由的 dependency 官方 cocoapods 上的三方或是的 local podSpec。
- 如果有 dependency 相同三方卻不同版本會有錯誤提示,不會有不同版本的錯誤!!!
- ex.手機專案裡
pod 'Flurry-iOS-SDK/FlurrySDK', '~> 9.0.0'
,在 TestFrameworkKit 裡dependency 'Flurry-iOS-SDK/FlurrySDK', '~> 8.0.0'
,會有錯誤提示
- ex.手機專案裡
- 因為三方統一在 Pod 裡,所以 TestFrameworkKit 用的三方,手機專案可以直接使用!!!
- ex.手機專案裡不需要再 pod Flurry、FB….,因為 TestFrameworkKit 已經 dependency 過, 只需要專注 pod 各自手機專案需要的特殊三方
- podSpec 專案架構與設定極為簡單,只要有 podspec 檔即可!!!
[第二期]:Local Podspec
利用 Local Podspec 的方式建立本地 Framework,多人協作就使用版控
開始學習建立 Podspec 模組或三方,往往都是從 Local 建立的,可以依照下面的步驟建立屬於自己的模組,記得將這份模組用 Git 進行版控開發,讓別人可以 Clone 下來使用 ,未來甚至可以上傳到公開的 CocoaPods Specs 裡讓大家下載。
建立方式
終端機執行
pod lib create TestPodFramework
依照需求回答一系列問題,最後建立專案
1
2
3
4
5
6
7
8
9
10What platform do you want to use?? [ iOS / macOS ]
> iOS
What language do you want to use?? [ Swift / ObjC ]
> Swift
Would you like to include a demo application with your library? [ Yes / No ]
> Yes
Which testing frameworks will you use? [ Quick / None ]
> None
Would you like to do view based testing? [ Yes / No ]
> No打開專案會看到 Demo 和 Framework 本身
替換 Development Pods 內的檔案或程式碼,新增自己要的類別或功能在
Class
資料夾(注意一定要在這)重新
pod install
,即可直接編譯 Demo 測試功能
使用方式
當其他專案要使用時,將 TestProject 和 TestPodFramework 放在同一層
新增 TestProject 的 podFile,並加上下列語法就是讀取本地模組
1
pod 'TestPodFramework', :path => '../TestPodFramework'
- 重新
pod install
,最後 import Framekwork 就可以使用
開發方式
相關應用
🤔【 問題 】
如果只有單一模組的話,多個功能之間會高度耦合,登入功能升版時,推播功能也必須升版,需要進行模組的拆分
希望這篇文章有幫助到您的開發之路!如果能給我一些按讚支持,我會非常感謝您的鼓勵!祝壞蟲遠離您!
評論