資料介紹
軟件簡(jiǎn)介
BeeHive是用于ios的app模塊化編程的框架實(shí)現(xiàn)方案,吸收了Spring框架service的理念來(lái)實(shí)現(xiàn)模塊間的API耦合?;驹砣缦?
實(shí)現(xiàn)以下特性
-
插件化的模塊開(kāi)發(fā)運(yùn)行框架
-
模塊具體實(shí)現(xiàn)與接口調(diào)用分離
-
模塊生命周期管理,擴(kuò)展了應(yīng)用的系統(tǒng)事件
因?yàn)榛赟pring的Service理念,雖然可以使模塊間的具體實(shí)現(xiàn)與接口解耦,但無(wú)法避免對(duì)接口類(lèi)的依賴(lài)關(guān)系。
為什么不使用invoke以及動(dòng)態(tài)鏈接庫(kù)技術(shù)實(shí)現(xiàn)對(duì)接口實(shí)現(xiàn)的解耦,類(lèi)似Apache的DSO的方式。
主要是考慮學(xué)習(xí)成本難度以及動(dòng)態(tài)調(diào)用實(shí)現(xiàn)無(wú)法在編譯檢查階段檢測(cè)接口參數(shù)變更等問(wèn)題,動(dòng)態(tài)技術(shù)需要更高的編程門(mén)檻要求
BeeHive靈感來(lái)源于蜂窩。蜂窩是世界上高度模塊化的工程結(jié)構(gòu),六邊形的設(shè)計(jì)能帶來(lái)無(wú)限擴(kuò)張的可能。所以我們用了BeeHive來(lái)做為這個(gè)項(xiàng)目的命名。
生命周期的變化
事件
BeeHive會(huì)給每個(gè)模塊提供生命周期事件,用于與BeeHive宿主環(huán)境進(jìn)行必要信息交互 事件分為三種類(lèi)型:
-
系統(tǒng)事件
-
通用事件
-
業(yè)務(wù)自定義事件
系統(tǒng)事件
系統(tǒng)事件通常是Application生命周期事件,例如DidBecomeActive、WillEnterBackground等 系統(tǒng)事件基本工作流如下:
通用事件
在系統(tǒng)事件的基礎(chǔ)之上,擴(kuò)展了應(yīng)用的通用事件,例如modSetup、modInit等,可以用于編碼實(shí)現(xiàn)各插件模塊的設(shè)置與初始化
擴(kuò)展的通用事件如下:
業(yè)務(wù)自定義事件
如果覺(jué)得系統(tǒng)事件、通用事件不足以滿足需要,我們還將事件封裝簡(jiǎn)化成BHAppdelgate,你可以通過(guò)繼承BHAppdelegate來(lái)擴(kuò)展自己的事件。
注冊(cè)
模塊注冊(cè)的方式有靜態(tài)注冊(cè)與動(dòng)態(tài)注冊(cè)兩種
-
靜態(tài)注冊(cè)
通過(guò)在BeeHive.plist文件中注冊(cè)符合BHModuleProtocol協(xié)議模塊類(lèi)
-
動(dòng)態(tài)注冊(cè)
@implementation?HomeModule BH_EXPORT_MODULE()??//聲明該類(lèi)為模塊入口
在模塊入口類(lèi)實(shí)現(xiàn)中 使用BH_EXPORT_MODULE()宏聲明該類(lèi)為模塊入口實(shí)現(xiàn)類(lèi)
異步加載
如果設(shè)置模塊導(dǎo)出為BH_EXPORT_MODULE(YES),則會(huì)在啟動(dòng)之后第一屏內(nèi)容展現(xiàn)之前異步執(zhí)行模塊的初始化,可以優(yōu)化啟動(dòng)時(shí)時(shí)間消耗
編程開(kāi)發(fā)
BHModuleProtocol為各個(gè)模塊提供了每個(gè)模塊可以hook的函數(shù),用于實(shí)現(xiàn)插件邏輯以及代碼實(shí)現(xiàn)
-
設(shè)置環(huán)境變量
通過(guò)context.env可以判斷我們的應(yīng)用環(huán)境狀態(tài)來(lái)決定我們?nèi)绾闻渲梦覀兊膽?yīng)用
-(void)modSetup:(BHContext?*)context { switch?(context.env)?{ case?BHEnvironmentDev: //....初始化開(kāi)發(fā)環(huán)境 break; case?BHEnvironmentProd: //....初始化生產(chǎn)環(huán)境 default: break; } }
-
模塊初始化
如果模塊有需要啟動(dòng)時(shí)初始化的邏輯,可以在modInit里編寫(xiě),例如模塊注冊(cè)一個(gè)外部模塊可以訪問(wèn)的Service接口
-(void)modInit:(BHContext?*)context { //注冊(cè)模塊的接口服務(wù) [[BeeHive?shareInstance]?registerService:@protocol(UserTrackServiceProtocol)?service:[BHUserTrackViewController?class]]; }
-
處理系統(tǒng)事件
系統(tǒng)的事件會(huì)被傳遞給每個(gè)模塊,讓每個(gè)模塊自己決定編寫(xiě)業(yè)務(wù)處理邏輯,比如3D-Touch功能
-(void)modQuickAction:(BHContext?*)context { [self?process:context.shortcutItem?handler:context.scompletionHandler]; }
模間調(diào)用
通過(guò)處理Event編寫(xiě)各個(gè)業(yè)務(wù)模塊可以實(shí)現(xiàn)插件化編程,各業(yè)務(wù)模塊之間沒(méi)有任何依賴(lài),core與module之間通過(guò)event交互,實(shí)現(xiàn)了插件隔離。但有時(shí)候我們需要模塊間的相互調(diào)用某些功能來(lái)協(xié)同完成功能。 通常會(huì)有三種形式的接口訪問(wèn)形式
-
基于接口的實(shí)現(xiàn)Service訪問(wèn)方式(java spring框架實(shí)現(xiàn))
-
基于函數(shù)調(diào)用約定實(shí)現(xiàn)的Export Method(PHP的extension,ReactNatve的擴(kuò)展機(jī)制)
-
基于跨應(yīng)用實(shí)現(xiàn)的Url route模式(iphone app之間的互訪)
我們目前實(shí)現(xiàn)了第一種方式,后續(xù)會(huì)逐步實(shí)現(xiàn)后兩種方式
Servcie訪問(wèn)
Service訪問(wèn)的優(yōu)點(diǎn)是可以編譯時(shí)檢查發(fā)現(xiàn)接口的變更,從而及時(shí)修正接口問(wèn)題。缺點(diǎn)是需要依賴(lài)接口定義的頭文件,通過(guò)模塊增加得越多,維護(hù)接口定義的也有一定工作量。以為HomeServiceProtocol為例
-
定義HomeServiceProtocol暴露模塊對(duì)外訪問(wèn)的接口
@protocol?HomeServiceProtocol?-(void)registerViewController:(UIViewController?*)vc?title:(NSString?*)title?iconName:(NSString?*)iconName; @end
-
注冊(cè)Service有三種方式
-
聲明式注冊(cè)
@implementation?HomeService BH_EXPORT_SERVICE()
-
API注冊(cè)
[[BeeHive?shareInstance]?registerService:@protocol(HomeServiceProtocol)?service:[BHViewController?class]];
-
BHService.plist注冊(cè)
HomeServiceProtocol BHViewController
-
調(diào)用
#import?"BHService.h" id?homeVc?=?[[BeeHive?shareInstance]?createService:@protocol(HomeServiceProtocol)];
單例與多例
對(duì)于有些場(chǎng)景下,我們?cè)L問(wèn)每個(gè)聲明為service的對(duì)象,希望對(duì)象能保留一些狀態(tài),那我們需要聲明這個(gè)service對(duì)象是一個(gè)單例對(duì)象。
我們只需要在service對(duì)象中實(shí)現(xiàn)事件函數(shù)
聲明
-(BOOL)?singleton { return?YES; }
通過(guò)createService獲取的對(duì)象則為單例對(duì)象,如果實(shí)現(xiàn)上面函數(shù)返回的是NO,則createService返回的是多例
id?homeVc?=?[[BeeHive?shareInstance]?createService:@protocol(HomeServiceProtocol)];
上下文環(huán)境Context
-
初始化設(shè)置應(yīng)用的項(xiàng)目信息,并在各模塊間共享整個(gè)應(yīng)用程序的信息
-?(BOOL)application:(UIApplication?*)application?didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions { [BHContext?shareInstance].env?=?BHEnvironmentDev;?//定義應(yīng)用的運(yùn)行開(kāi)發(fā)環(huán)境 [BHContext?shareInstance].application?=?application; [BHContext?shareInstance].launchOptions?=?launchOptions; [BHContext?shareInstance].moduleConfigName?=?@"BeeHive.bundle/CustomModulePlist";//可選,默認(rèn)為BeeHive.bundle/BeeHive.plist [BHContext?shareInstance].serviceConfigName?=??@"BeeHive.bundle/CustomServicePlist";//可選,默認(rèn)為BeeHive.bundle/BHService.plist [[BeeHive?shareInstance]?setContext:[BHContext?shareInstance]]; [super?application:application?didFinishLaunchingWithOptions:launchOptions]; id?homeVc?=?[[BeeHive?shareInstance]?createService:@protocol(HomeServiceProtocol)]; if?([homeVc?isKindOfClass:[UIViewController?class]])?{ UINavigationController?*navCtrl?=?[[UINavigationController?alloc]?initWithRootViewController:(UIViewController*)homeVc]; self.window?=?[[UIWindow?alloc]?initWithFrame:[UIScreen?mainScreen].bounds]; self.window.rootViewController?=?navCtrl; [self.window?makeKeyAndVisible]; } return?YES; }
更多細(xì)節(jié)可以參考Example用例
集成方式
-
use cocoapods
pod "BeeHive", '1.0.0'
作者
一渡, shijie.qinsj@alibaba-inc.com
達(dá)茲, dazi.dp@alibaba-inc.com
- 1005 電子編程入門(mén)到工程師--單片機(jī)程序框架模塊化加速學(xué)習(xí)
- 單片機(jī)零基礎(chǔ)入門(mén)(8-5)模塊化編程
- 電路模塊化電路圖紙參考設(shè)計(jì) 15次下載
- 【C語(yǔ)言】模塊化編程-通俗易懂
- 藍(lán)橋杯模塊化編程
- 【單片機(jī)】Keil+Proteus流水燈(模塊化編程)
- 開(kāi)關(guān)電源設(shè)計(jì)模塊化與并聯(lián)技術(shù)
- 模塊化逆變電源的設(shè)計(jì)與應(yīng)用總結(jié)
- 電賽模塊化程序案例下載 12次下載
- FPGA模塊化設(shè)計(jì)與AlteraHardCopy結(jié)構(gòu)化ASIC 6次下載
- 如何實(shí)現(xiàn)單片機(jī)C語(yǔ)言的模塊化編程 11次下載
- LCD1602液晶屏的模塊化編程程序和工程文件免費(fèi)下載 10次下載
- 單片機(jī)的C語(yǔ)言模塊化編程 51次下載
- 模塊化編程思想 16次下載
- 012-IIC總線原理和模塊化編程方法 7次下載
- 模塊化插座接線方法有哪些 697次閱讀
- PLC模塊化和結(jié)構(gòu)化編程實(shí)例 1091次閱讀
- 模塊化機(jī)柜 vs.一體化機(jī)柜 745次閱讀
- 如何模塊化編程 1338次閱讀
- 歐姆龍模塊化編程的使用技巧 2068次閱讀
- 如何實(shí)現(xiàn)單片機(jī)編程的模塊化設(shè)計(jì) 4783次閱讀
- 協(xié)作機(jī)器人編程模塊化的需求如何滿足? 3951次閱讀
- PLC模塊化編程和結(jié)構(gòu)化編程 8714次閱讀
- 單片機(jī)模塊化編程的原則有哪些 2440次閱讀
- 單片機(jī)模塊化編程串口中斷怎么處理 5921次閱讀
- 關(guān)于類(lèi)別化與模塊化設(shè)計(jì)模式的解釋 5467次閱讀
- 解讀:一種基于模塊化設(shè)計(jì)的PLM平臺(tái)建設(shè) 1755次閱讀
- 模塊化UPS電源的構(gòu)成以及優(yōu)缺點(diǎn)盤(pán)點(diǎn) 7273次閱讀
- 模塊化電源有什么優(yōu)勢(shì) 6755次閱讀
- TAPI軟電話通信系統(tǒng)的模塊化設(shè)計(jì) 2387次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開(kāi)發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊(cè)
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論