iOS 模塊化編程框架 BeeHive

github下載地址:https://github.com/alibaba/BeeHive

BeeHive 詳細介紹

BeeHive是用于iOS的app模塊化編程的框架實現(xiàn)方案,吸收了Spring框架service的理念來實現(xiàn)模塊間的API耦合厘熟〈卧保基本原理如下:

基本原理.jpg

實現(xiàn)以下特性

  • 插件化的模塊開發(fā)運行框架
  • 模塊具體實現(xiàn)與接口調(diào)用分離
  • 模塊生命周期管理,擴展了應用的系統(tǒng)事件

因為基于Spring的Service理念秧秉,雖然可以使模塊間的具體實現(xiàn)與接口解耦污桦,但無法避免對接口類的依賴關系空盼。

為什么不使用invoke以及動態(tài)鏈接庫技術實現(xiàn)對接口實現(xiàn)的解耦书幕,類似Apache的DSO的方式。

主要是考慮學習成本難度以及動態(tài)調(diào)用實現(xiàn)無法在編譯檢查階段檢測接口參數(shù)變更等問題揽趾,動態(tài)技術需要更高的編程門檻要求

BeeHive靈感來源于蜂窩台汇。蜂窩是世界上高度模塊化的工程結構,六邊形的設計能帶來無限擴張的可能篱瞎。所以我們用了BeeHive來做為這個項目的命名苟呐。

生命周期的變化

事件

BeeHive會給每個模塊提供生命周期事件,用于與BeeHive宿主環(huán)境進行必要信息交互 事件分為三種類型:

  • 系統(tǒng)事件
  • 通用事件
  • 業(yè)務自定義事件

系統(tǒng)事件

系統(tǒng)事件通常是Application生命周期事件俐筋,例如DidBecomeActive牵素、WillEnterBackground等系統(tǒng)事件基本工作流如下:


系統(tǒng)事件基本工作流.jpeg

通用事件

在系統(tǒng)事件的基礎之上,擴展了應用的通用事件澄者,例如modSetup笆呆、modInit等,可以用于編碼實現(xiàn)各插件模塊的設置與初始化

擴展的通用事件如下:


通用事件.jpeg

業(yè)務自定義事件

如果覺得系統(tǒng)事件粱挡、通用事件不足以滿足需要赠幕,我們還將事件封裝簡化成BHAppdelgate,你可以通過繼承BHAppdelegate來擴展自己的事件询筏。

注冊

模塊注冊的方式有靜態(tài)注冊與動態(tài)注冊兩種

  • 靜態(tài)注冊
    通過在BeeHive.plist文件中注冊符合BHModuleProtocol協(xié)議模塊類


    靜態(tài)注冊.png
  • 動態(tài)注冊
@implementation HomeModule
BH_EXPORT_MODULE()  //聲明該類為模塊入口

在模塊入口類實現(xiàn)中 使用BH_EXPORT_MODULE()宏聲明該類為模塊入口實現(xiàn)類

異步加載

如果設置模塊導出為BH_EXPORT_MODULE(YES)榕堰,則會在啟動之后第一屏內(nèi)容展現(xiàn)之前異步執(zhí)行模塊的初始化,可以優(yōu)化啟動時時間消耗

編程開發(fā)

BHModuleProtocol為各個模塊提供了每個模塊可以hook的函數(shù)嫌套,用于實現(xiàn)插件邏輯以及代碼實現(xiàn)

  • 設置環(huán)境變量
    通過context.env可以判斷我們的應用環(huán)境狀態(tài)來決定我們?nèi)绾闻渲梦覀兊膽?/li>
-(void)modSetup:(BHContext *)context
{
    switch (context.env) {
        case BHEnvironmentDev:
        //....初始化開發(fā)環(huán)境
        break;
        case BHEnvironmentProd:
        //....初始化生產(chǎn)環(huán)境
        default:
        break;
    }
}
  • 模塊初始化
    如果模塊有需要啟動時初始化的邏輯局冰,可以在modInit里編寫,例如模塊注冊一個外部模塊可以訪問的Service接口
-(void)modInit:(BHContext *)context
{
    //注冊模塊的接口服務
    [[BeeHive shareInstance] registerService:@protocol(UserTrackServiceProtocol) service:[BHUserTrackViewController class]];
}
  • 處理系統(tǒng)事件
    系統(tǒng)的事件會被傳遞給每個模塊灌危,讓每個模塊自己決定編寫業(yè)務處理邏輯,比如3D-Touch功能
-(void)modQuickAction:(BHContext *)context
{
    [self process:context.shortcutItem handler:context.scompletionHandler];
}

模間調(diào)用

通過處理Event編寫各個業(yè)務模塊可以實現(xiàn)插件化編程碳胳,各業(yè)務模塊之間沒有任何依賴勇蝙,core與module之間通過event交互,實現(xiàn)了插件隔離挨约。但有時候我們需要模塊間的相互調(diào)用某些功能來協(xié)同完成功能味混。 通常會有三種形式的接口訪問形式

  • 基于接口的實現(xiàn)Service訪問方式(java spring框架實現(xiàn))
  • 基于函數(shù)調(diào)用約定實現(xiàn)的Export Method(PHP的extension产雹,ReactNatve的擴展機制)
  • 基于跨應用實現(xiàn)的Url route模式(iphone app之間的互訪)

我們目前實現(xiàn)了第一種方式,后續(xù)會逐步實現(xiàn)后兩種方式

Servcie訪問

Service訪問的優(yōu)點是可以編譯時檢查發(fā)現(xiàn)接口的變更翁锡,從而及時修正接口問題蔓挖。缺點是需要依賴接口定義的頭文件,通過模塊增加得越多馆衔,維護接口定義的也有一定工作量瘟判。以為HomeServiceProtocol為例

  • 定義HomeServiceProtocol暴露模塊對外訪問的接口
@protocol HomeServiceProtocol <NSObject, BHServiceProtocol>
-(void)registerViewController:(UIViewController *)vc title:(NSString *)title iconName:(NSString *)iconName;
@end
  • 注冊Service有三種方式
  • 聲明式注冊
@implementation HomeService
BH_EXPORT_SERVICE()
  • API注冊
[[BeeHive shareInstance] registerService:@protocol(HomeServiceProtocol) service:[BHViewController class]];
  • BHService.plist注冊
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>HomeServiceProtocol</key>
<string>BHViewController</string>
</dict>
</plist>
  • 調(diào)用
#import "BHService.h"
id< HomeServiceProtocol > homeVc = [[BeeHive shareInstance] createService:@protocol(HomeServiceProtocol)];

單例與多例

對于有些場景下,我們訪問每個聲明為service的對象角溃,希望對象能保留一些狀態(tài)拷获,那我們需要聲明這個service對象是一個單例對象。

我們只需要在service對象中實現(xiàn)事件函數(shù)

聲明

-(BOOL) singleton
{
    return YES;
}

通過createService獲取的對象則為單例對象减细,如果實現(xiàn)上面函數(shù)返回的是NO匆瓜,則createService返回的是多例

id< HomeServiceProtocol > homeVc = [[BeeHive shareInstance] createService:@protocol(HomeServiceProtocol)];

上下文環(huán)境Context

  • 初始化設置應用的項目信息,并在各模塊間共享整個應用程序的信息
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [BHContext shareInstance].env = BHEnvironmentDev; //定義應用的運行開發(fā)環(huán)境
    [BHContext shareInstance].application = application;
    [BHContext shareInstance].launchOptions = launchOptions;
    [BHContext shareInstance].moduleConfigName = @"BeeHive.bundle/CustomModulePlist";//可選未蝌,默認為BeeHive.bundle/BeeHive.plist
    [BHContext shareInstance].serviceConfigName =  @"BeeHive.bundle/CustomServicePlist";//可選驮吱,默認為BeeHive.bundle/BHService.plist
    [[BeeHive shareInstance] setContext:[BHContext shareInstance]];
    [super application:application didFinishLaunchingWithOptions:launchOptions];
    id<HomeServiceProtocol> 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;
}

更多細節(jié)可以參考Example用例

  • 集成方式

use cocoapods
pod "BeeHive", '1.0.0'

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市萧吠,隨后出現(xiàn)的幾起案子左冬,更是在濱河造成了極大的恐慌,老刑警劉巖怎憋,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件又碌,死亡現(xiàn)場離奇詭異,居然都是意外死亡绊袋,警方通過查閱死者的電腦和手機烦秩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門撤奸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事筐赔。” “怎么了沐绒?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵犁柜,是天一觀的道長。 經(jīng)常有香客問我圾笨,道長教馆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任擂达,我火速辦了婚禮土铺,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己悲敷,他們只是感情好究恤,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著后德,像睡著了一般部宿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瓢湃,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天理张,我揣著相機與錄音,去河邊找鬼箱季。 笑死涯穷,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的藏雏。 我是一名探鬼主播拷况,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼掘殴!你這毒婦竟也來了赚瘦?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤奏寨,失蹤者是張志新(化名)和其女友劉穎起意,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體病瞳,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡揽咕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了套菜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亲善。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖逗柴,靈堂內(nèi)的尸體忽然破棺而出蛹头,到底是詐尸還是另有隱情,我是刑警寧澤戏溺,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布渣蜗,位于F島的核電站,受9級特大地震影響旷祸,放射性物質(zhì)發(fā)生泄漏耕拷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一托享、第九天 我趴在偏房一處隱蔽的房頂上張望骚烧。 院中可真熱鬧控淡,春花似錦、人聲如沸止潘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凭戴。三九已至,卻和暖如春炕矮,著一層夾襖步出監(jiān)牢的瞬間么夫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工肤视, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留档痪,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓邢滑,卻偏偏與公主長得像腐螟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子困后,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

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