iOS-本地化組件化的實(shí)踐

前言

業(yè)界已經(jīng)有許多技術(shù)文章進(jìn)行了組件化的指導(dǎo)了横漏,這里就不再贅述穴吹。

本文主要講的是小型團(tuán)隊(duì)和小型項(xiàng)目對(duì)于「本地組件化」的實(shí)踐氢惋。

為什么要提出組件化本地化的概念呢桶良?對(duì)于小型項(xiàng)目和小型團(tuán)隊(duì)來(lái)說座舍,可能自身的項(xiàng)目不需要用到組件化,但是又想學(xué)習(xí)和利用組件化的技術(shù)陨帆,組件化的本地化恰好可以滿足這個(gè)需求曲秉。

那么何為本地化的組件化呢?對(duì)于常規(guī)的組件化來(lái)說疲牵,每一個(gè)模塊或者說組件都需要?jiǎng)?chuàng)建為一個(gè)遠(yuǎn)端的組件庫(kù)承二,別的模塊從遠(yuǎn)端加載這個(gè)組件來(lái)使用,這樣就需要管理非常多的庫(kù)纲爸。而本地化的組件化只需要?jiǎng)?chuàng)建一個(gè)遠(yuǎn)端的代碼庫(kù)亥鸠,存放所有的代碼,進(jìn)行版本管理识啦,跟平常的代碼管理一樣负蚊,所有的組件也是放在這個(gè)庫(kù)中,無(wú)需創(chuàng)建多個(gè)組件庫(kù)颓哮,所以叫做本地化的組件化家妆。

技術(shù)思路

本地化的組件化的技術(shù)思路是這樣的,項(xiàng)目使用 workspace 來(lái)管理所有的 Project冕茅,其中的一個(gè) Project 為主項(xiàng)目伤极,其他的為不同的組件,新增組件就在這個(gè) workspace 中新建一個(gè) Project姨伤。

運(yùn)行主項(xiàng)目就選用主項(xiàng)目 Project哨坪,運(yùn)行單一組件就選擇這個(gè)組件 Project 進(jìn)行運(yùn)行。

而跨模塊的通信使用的是基于反射的遠(yuǎn)程接口調(diào)用封裝姜挺,基于 CTMediator 開源庫(kù)齿税。

Demo實(shí)踐

比如現(xiàn)在要開發(fā)一款記錄類型的APP彼硫,可以記錄身體信息炊豪,比如身高體重等凌箕,基本的業(yè)務(wù)邏輯是,先進(jìn)行登錄词渤,然后進(jìn)入主功能界面牵舱,提供首頁(yè)記錄功能和我的頁(yè)面兩個(gè) Tab。

Github-ModularizationDemo

以下是具體的實(shí)踐過程:

創(chuàng)建 workspace

如圖方式創(chuàng)建一個(gè)名為 Records.xcworkspace 的 workspace

workspace.png
創(chuàng)建 Project
  • 首頁(yè)
  • 我的
  • 登錄
  • 身體信息組件
  • 公共組件

按照功能缺虐,劃分為這幾個(gè)組件芜壁,分別創(chuàng)建4個(gè) project,其中首頁(yè)和我的放在主 project中高氮,身體信息慧妄、登錄和公共組件為單一組件,公共組件放一下功能分類剪芍,公共類塞淹,宏定義,后臺(tái)接口文檔之類的罪裹。

command + shift + N 創(chuàng)建 Project

注意要放在 Records 這個(gè) workspace 中

add_project.png

創(chuàng)建完成如圖

structure.png

構(gòu)造組件

舉個(gè)例子饱普,先完成登錄組件,把項(xiàng)目切換到 登錄

login.png

完成登錄的基本業(yè)務(wù)邏輯状共,運(yùn)行沒有錯(cuò)誤之后套耕,進(jìn)行組件化的工作

podspec 文件

在終端創(chuàng)建 podspec 文件

pod spec create 文件名

使用這種方法創(chuàng)建的 podspec 文件會(huì)帶有大量的注釋
touch xx.podspec

使用這種方法會(huì)創(chuàng)建出一個(gè)空白的 podspec 文件

我們創(chuàng)建跟組件同名的 Login.podspec 文件, 詳細(xì)語(yǔ)法參考 Podspec語(yǔ)法參考

Pod::Spec.new do |s|
    s.name             = 'Login'
    s.version          = '0.0.1'
    s.summary          = '登錄組件'

    s.description      = <<-DESC
    TODO: Add long description of the pod here.
    DESC

    s.homepage         = 'https://gitee.com/xxx'
    # s.license          = { :type => 'MIT', :file => 'LICENSE' }
    s.author           = { 'xxx' => 'xxxxxxxxx@qq.com' }
    s.source           = { :git => 'https://gitee.com/xxx/Login.git', :tag => s.version.to_s }

    s.ios.deployment_target = '9.0'
    
    s.source_files = 'Login/Login/*.{h,m}'

    s.subspec 'Controller' do |ss|
        ss.source_files = 'Login/Login/Controller/*.{h,m}'
    end

    s.subspec 'Router' do |ss|
        ss.source_files = 'Login/Login/Router/*.{h,m}'
    end

    s.subspec 'View' do |ss|
        ss.source_files = 'Login/Login/View/*.{h,m}'
    end

    s.dependency 'CTMediator'

    s.prefix_header_contents = <<-EOS

    #ifdef __OBJC__
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    #endif

    EOS
end

CTMediator

這是其他組件調(diào)用本組件的入口,通過創(chuàng)建 CTMediator 的分類峡继,獲取該組件入口控制器冯袍,比如當(dāng)前登錄組件就是通過 CTMediator+Login 分類中的方法獲取登錄控制器。

CTMediator.png

至此碾牌,登錄組件已經(jīng)完成颠猴,按照上訴步驟,完成其他組件的構(gòu)建

組件的調(diào)用

構(gòu)造 Podfile 文件

在 workspace 的根目錄下創(chuàng)建 Podfile 文件小染,并完成構(gòu)建

Podfile.png
source 'https://github.com/CocoaPods/Specs.git'

# Uncomment the next line to define a global platform for your project
platform :ios, '9.0'

workspace 'Records.xcworkspace'

target 'Record' do

  project 'Record/Record.xcodeproj'
  
  pod 'CTMediator'
  
  #調(diào)用登錄組件
  pod 'Login', :path => '../Record/Login/'

  inhibit_all_warnings!
  
end

#登錄組件
target 'Login' do

  project 'Login/Login.xcodeproj'

  inhibit_all_warnings!

end

在終端使用以下命令完成本地組件的加載

pod update --no-repo-update

加載完成后翘瓮,可以在 Pods 中的 Development Pods 看到加載的組件

Pods.png

切換到主工程 Record,進(jìn)行登錄組件的調(diào)用

Record.png

在需要用到組件的地方裤翩,導(dǎo)入組件中的CTMediator分類文件(CTMediator+Login.h)资盅,調(diào)用分類方法,獲取控制器踊赠,進(jìn)行控制器的使用跳轉(zhuǎn)呵扛,demo 是在 AppDelegate 中調(diào)用

#import <Login/CTMediator+Login.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    
    UIViewController *loginVc = [[CTMediator sharedInstance] loginVc];
    
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:loginVc];
    
    self.window.rootViewController = nav;
    
    [self.window makeKeyAndVisible];
    
    return YES;
}

至此,本地化組件化的基本實(shí)踐流程已完成筐带,具體請(qǐng)參考Demo今穿。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市伦籍,隨后出現(xiàn)的幾起案子蓝晒,更是在濱河造成了極大的恐慌腮出,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芝薇,死亡現(xiàn)場(chǎng)離奇詭異胚嘲,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)洛二,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門馋劈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人晾嘶,你說我怎么就攤上這事妓雾。” “怎么了垒迂?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵君珠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我娇斑,道長(zhǎng)策添,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任毫缆,我火速辦了婚禮唯竹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘苦丁。我一直安慰自己浸颓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布旺拉。 她就那樣靜靜地躺著产上,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蛾狗。 梳的紋絲不亂的頭發(fā)上晋涣,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音沉桌,去河邊找鬼谢鹊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛留凭,可吹牛的內(nèi)容都是我干的佃扼。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼蔼夜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼兼耀!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瘤运,失蹤者是張志新(化名)和其女友劉穎窍霞,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尽超,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年梧躺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了似谁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡掠哥,死狀恐怖巩踏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情续搀,我是刑警寧澤塞琼,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站禁舷,受9級(jí)特大地震影響彪杉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜牵咙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一派近、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧洁桌,春花似錦渴丸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至吠谢,卻和暖如春土童,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背工坊。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工娜扇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人栅组。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓雀瓢,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子听绳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 這篇文章參考 casa 大神的組件化實(shí)踐和使用Cocoapods創(chuàng)建私有podspec沦辙,不過因?yàn)橹皩?duì) iOS 組...
    its程閱讀 20,877評(píng)論 23 109
  • 一消痛、前言 什么是組件化 組件化就是將APP拆分成各個(gè)組件泊业,然后通過主工程將項(xiàng)目所需要的組件組合起來(lái)把沼,比如首頁(yè),個(gè)人...
    _Andy_閱讀 2,139評(píng)論 2 12
  • http://casatwy.com/modulization_in_action.html 前述 國(guó)內(nèi)業(yè)界大家對(duì)...
    yuditxj閱讀 1,194評(píng)論 2 6
  • 吃瓜 看了Casa和Limboy's關(guān)于組件化的討論吁伺,有種神仙打架饮睬,小鬼吃瓜的既視感,在這談?wù)勎覍?duì)于組件化的理解篮奄。...
    beginBird閱讀 3,175評(píng)論 1 11
  • 這周我也開始有計(jì)劃的思考自己可以做什么捆愁,比如如何組織更多的活動(dòng),也開始計(jì)劃準(zhǔn)備組建一個(gè)班級(jí)社團(tuán)——學(xué)習(xí)java開發(fā)...
    duet丶閱讀 320評(píng)論 1 1