背景:之前有看到QMUI_iOS這個UI框架,發現里面幾乎涵蓋了所有常用的UI控件了,而且支持通過配置文件方便的實現更換主題、統一按鈕顏色、tableviewcell高度等,就想去體驗一把,這次想寫一個組件化的demo就剛好用上辣~~~
總體來說使用CTMediator實現組件化,主要歷經兩大步驟:
1.基于之前做的APP原型完成基于CTMediator和QMUI_iOS的完整Demo,PXProject.
2.新建主工程PXMainProject,將Demo的各個組件和各模塊做成私有庫,最后演變成orgnization HelloPixie
基于CTMediator和QMUI的完整Demo
在之前項目(花都)的原型上用QMUI搭建各個界面(基本能覆蓋百分之八九十的常見UI控件)。
1.模塊拆分
(1)功能模塊
將項目拆分成Tabbar(PXTabBarViewController)、首頁(PXHome)、接種計劃(PXVaccinationPlans)、健康(PXHealth)、個人中心(PXPersonalCenter)五大功能模塊模塊
(2)通用組件
異常處理(PXNoTarget)、空頁面(PXEmptyView_Category)、控制器通用配置(QMUICommonViewController_Category)
(3)QMUI配置文件(APP控件顏色,高度等配置項)
QMUIConfigurationTemplate
Tips:這些模塊和組件應該是平級的,在一個項目中不應該有general等文件夾,所有的功能或者模塊應該都是平級的,便于維護和管理.
2.功能編寫
要點:
推薦QMUI_iOS_CodeSnippets代碼塊提升編碼效率
和QMUI_iOS_Templates這個還沒用,需要管理員權限安裝,配合QMUI使用。模塊間的引用通過CTMediator Category來降低耦合,可以先將本模塊對外通信的Category設計出來,可以做到不影響其他模塊的代碼編寫,并行任務。
每個模塊都有一個對應的Target_XXX,負責提供對外的接口,這里面Action不局限于返回ViewController,還能做上傳任務等,它的本質就是對外業務的一層服務化封裝。Target_XXX可以引用本模塊的各個文件,對應的CTMediator Category調用Target的相關Action解耦。
將Demo的各個組件和各模塊做成私有庫
參考文章Casa在現有工程中實施基于CTMediator的組件化方案
具體步驟:
創建一個orgnization,里面應該有個MainProject主工程(將之前PXProject里面的功能模塊拆出去,只剩下QMUIConfigurationTemplate、PXPTabBarSetting.plist)
再去開一個repo,這個repo就是我們私有Pod源倉庫
pod repo add [私有Pod源倉庫名字] [私有Pod源的repo地址]
創立一個文件夾,例如Project。把我們的主工程文件夾放到Project下:~/Project/MainProject
在~/Project下clone快速配置私有源的腳本repo:git clone git@github.com:casatwy/ConfigPrivatePod.git
將ConfigPrivatePod的template文件夾下Podfile中source 'https://github.com/ModulizationDemo/PrivatePods.git'改成第一步里面你自己的私有Pod源倉庫的repo地址
將ConfigPrivatePod的template文件夾下upload.sh中PrivatePods改成第二步里面你自己的私有Pod源倉庫的名字
接下來是私有庫的創建過程:
- 創建各個模塊的工程,放置Project文件夾下,與ConfigPrivatePod平級目錄
- cd到ConfigPrivatePod下,執行./config.sh腳本來配置這個私有Pod(在XCode工程的代碼目錄下新建一個跟項目同名的目錄。放在這個目錄下的代碼就會隨著Pod的發版而發出去,這個目錄以外的代碼就不會跟隨Pod的版本發布而發布)
- 修改podfile 和 .podspec文件(添加三方庫依賴/支持系統版本/圖片資源...)
特別注意:將圖片資源作為resource_bundles引入時.podspec應該是下面這樣
s.resource_bundles = {
'PXHome' => ['PXHome/PXHome/Assets/*.xcassets']
}
獲取圖片時,代碼應該是這樣:
UIImage *image = [self getImageWithBoudleName:@"PXHome" imgName:dic[@"image"]];
- (UIImage *)getImageWithBoudleName:(NSString *)boudleName imgName:(NSString *)imgName {
NSBundle *bundle = [NSBundle bundleForClass:[self class]];
NSURL *url = [bundle URLForResource:boudleName withExtension:@"bundle"];
NSBundle *targetBundle = [NSBundle bundleWithURL:url];
UIImage *image = [UIImage imageNamed:imgName
inBundle:targetBundle
compatibleWithTraitCollection:nil];
return image;
}
- 發布私有庫及關聯本地代碼到遠程倉庫
注意:修改upload.sh文件,將最后一行發布命令最后的一個參數去掉,否則會報錯,如果私有庫里面包含了私有庫,需要指定sources,類似于:
pod repo push PXPrivatePods PXHome.podspec --sources=https://gitee.com/HelloPixie/PrivatePods.git,https://github.com/CocoaPods/Specs.git --verbose --allow-warnings --use-libraries
提交并上傳私有庫
git add .
git commit -m "版本號"
git tag 版本號
git push origin master --tags
./upload.sh
要注意的是,這里的版本號要和podspec文件中的s.version給到的版本號一致。upload.sh是配置私有Pod的腳本生成的,如果你這邊沒有upload.sh這個文件,說明這個私有Pod你還沒用腳本配置過。
重復上述幾個步驟,完成對各個模塊的發版工作,最后,在PXMainProject的podfile將創建的私有庫引入進來,編譯、運行、大功告成。
遠程調用
上面是本地調用的方式,遠程調用使用以下API即可(參考Target_PXPersonalCenter):
// 遠程App調用入口,或者banner的跳轉等都可使用
// url sample: aaa://targetA/actionB?id=1234
- (id)performActionWithUrl:(NSURL *)url completion:(void(^)(NSDictionary *info))completion