天天看點

iOS 元件化方案

概述

近一年iOS業界讨論元件化方案甚多,大體來說有3種。

Protocol注冊方案

URL注冊方案

Target-Action runtime調用方案

URL注冊方案據我了解很多大公司都在采用,蘑菇街 App 的元件化之路(http://limboy.me/tech/2016/03/10/mgj-components.html)蘑菇街的Limboy在這篇部落格中做了很詳盡的闡述

Target-Action runtime調用方案Casa在 iOS應用架構談 元件化方案(http://casatwy.com/iOS-Modulization.html)中也做了很詳盡的描述,前陣時間Casa開了一篇部落格在現有工程中實施基于CTMediator的元件化方案清楚講述了如何用這套方案實施元件化

Protocol方案我尚未看到有人做過詳盡的分享,也許是我孤陋寡聞,不過在這裡,我會教大家用Protocol方案實施(http://casatwy.com/modulization_in_action.html)元件化,不僅如此..

我會采用以上3種方案詳盡的實作3個Demo,Demo會在文尾給到,本文不過多闡述3種方案的優劣,我會在最後做一個總結,希望給想了解元件化方案的同學或者給在項目中準備實施元件化方案的同學提供一個借鑒。

業務模拟場景

首頁展示商品清單

商品詳情頁展示商品的詳細資訊

确認訂單頁生成訂單

把業務連貫起來 點選首頁中A商品,進入A商品的商品詳情頁 ,點選商品詳情頁中的 立即購買 進入确認訂單頁,點選确認訂單頁中的送出訂單 會傳回到商品詳情頁,并且在商品詳情頁中告知使用者下單成功.

真實業務場景下确認訂單頁 點送出訂單 是不會回到商品詳情頁的,模拟這個場景是想在Demo中實作2個子產品中反向回調。

一、Protocol注冊方案

正式實施前先奉上Demo,建議隻下一個主項目就可以了(注:下載下傳完不需要pod install或者pod update,pods在我私有源上 我沒有填寫.gitignore檔案,下載下傳完都是可以直接跑的)

主項目位址

https://github.com/sun6boys/CRMainProject

商品詳情業務接口元件位址

https://github.com/sun6boys/CRGoodsDetailServiceProtocol

商品詳情業務元件位址

https://github.com/sun6boys/CRGoodsDetail

确認訂單業務接口元件位址

https://github.com/sun6boys/CRConfirmOrderServiceProtocol

确認訂單業務元件位址

https://github.com/sun6boys/CRConfirmOrder

業務排程中間件位址

https://github.com/sun6boys/CRProtocolManager

1.基本準備工作

先去gitHub建立一個項目存放私有Repo源,repo位址https://github.com/sun6boys/CRRepositories.git 後面3種方案私有pod源都會放在這裡。

本地添加私有源 終端執行指令pod repo add CRRepositories https://github.com/sun6boys/CRRepositories.git(如果之前并未向gitHub push過檔案也沒有把SSH公鑰儲存到gitHub,這時候應該會提示你輸入gitHub賬号密碼)

以上操作完成 cd ~/.cocoapods/repos目錄下至少會有2個檔案夾 *CRRepositories 和 master, master檔案下面存放的是公有源檔案,CRRepositories目錄下目前是空的,後面會存放我們私有源檔案

基本準備工作完成。

2.Xcode建立項目[CRProtocolManager]

CRProtocolManager和MGJRouter、CTMediator一樣屬于子產品之間排程的中間件

在CRProtocolManager項目下建立名為CRProtocolManager的檔案夾,後面我們需要做成私有pod的檔案均放在該檔案夾下。

建立CRProtocolManager類(.h,.m),定義2個對外接口

具體方法實作很簡單可以參看Demo,我這裡隻是簡單處理。

接下來就是要把項目送出到gitHub,做私有pod了

gitHub建立一個project名為CRProtocolManager

終端cd至CRProtocolManager項目目錄下執行指令git remote add origin https://github.com/sun6boys/CRProtocolManager.git

因cocoaPods強制添加開源許可檔案執行指令echo MIT>FILE_LICENSE建立名為FILE_LICENSE的檔案

終端cd至CRProtocolManager目錄下執行指令pod spec create CRProtocolManager

執行指令vim .CRProtocolManager.podspec編輯podspec檔案,具體如何編輯可參看Demo中的podspec檔案或者google

退出編輯執行指令git add .

`git commit -m ‘log’

git tag 0.0.1 tag一定要和podspec中的version一緻

git push origin master --tags –tags為了把剛才添加的tag送出上去

執行指令pod repo push CRRepositories CRProtocolManager.podspec --verbose --allow-warnings 注:CRRepositories即為準備工作中的私有源倉庫

成功後pod search CRProtocolManager應該就能搜尋到了

萬裡長征終于走完第一步,基礎設施已經建構完畢

3.商品詳情業務子產品

既然元件化了,那我們所有的業務子產品都是單獨的project,但是這裡我會分2個project,一個是商品詳情業務入口子產品,一個是商品詳情業務子產品。業務入口子產品即是定義該子產品對外提供業務接口的protocol,如果A子產品需要調用到B子產品,那A子產品隻需要引入CRProtocolManager和B子產品的protocol,而不是引入整個B子產品。

建立一個projectCRGoodsDetailServiceProtocol,建立一個和項目名一樣的protocol檔案,定義接口如下

參照CRProtocolManager做成私有pod

以上實施完畢,建立一個projectCRGoodsDetail,建立2個類

CRGoodsDetailServiceProvide即是CRGoodsDetailServiceProtocol的實作者 是以他依賴

CRGoodsDetailServiceProtocol,因為商品詳情子產品需要跳轉到訂單确認頁,是以他也依賴CRProtocolManager。

 添加Podfile檔案編輯如下

執行pod install --verbose --no-repo-update

最終CRGoodsDetailServiceProvide實作代碼如下

CRGoodsDetailViewController實作代碼如下

把CRGoodsDetail做成私有pod 記得編輯podspec檔案的時候添加dependencyCRProtocolManager CRGoodsDetailServiceProtocol

4.建立主項目MainProject

為了少建一個項目首頁子產品我是直接放在主項目中的,按理首頁也應該是一個獨立的pod.

首頁業務場景是,顯示商品清單,點選某個商品進入該商品詳情頁. 是以他依賴CRGoodsDetailServiceProtocol和CRProtocolManager因為首頁子產品即是主項目是以他還得依賴CRGoodsDetail

最終首頁核心代碼如下

5.确認訂單子產品

參照商品詳情建立确認訂單業務入口pod 以及确認訂單業務pod.和商品詳情有差別的是,送出訂單完成後要回到商品詳情并且通知商品詳情使用者已經購買,是以CRConfirmOrderServiceProtocol接口定義如下

最後記得在商品詳情加上跳轉并且podspec裡面加上dependency

Protocol注冊方案完結