資料介紹
軟件簡介
BeeHive是用于ios的app模塊化編程的框架實現方案,吸收了Spring框架service的理念來實現模塊間的API耦合。基本原理如下:
實現以下特性
-
插件化的模塊開發運行框架
-
模塊具體實現與接口調用分離
-
模塊生命周期管理,擴展了應用的系統事件
因為基于Spring的Service理念,雖然可以使模塊間的具體實現與接口解耦,但無法避免對接口類的依賴關系。
為什么不使用invoke以及動態鏈接庫技術實現對接口實現的解耦,類似Apache的DSO的方式。
主要是考慮學習成本難度以及動態調用實現無法在編譯檢查階段檢測接口參數變更等問題,動態技術需要更高的編程門檻要求
BeeHive靈感來源于蜂窩。蜂窩是世界上高度模塊化的工程結構,六邊形的設計能帶來無限擴張的可能。所以我們用了BeeHive來做為這個項目的命名。
生命周期的變化
事件
BeeHive會給每個模塊提供生命周期事件,用于與BeeHive宿主環境進行必要信息交互 事件分為三種類型:
-
系統事件
-
通用事件
-
業務自定義事件
系統事件
系統事件通常是Application生命周期事件,例如DidBecomeActive、WillEnterBackground等 系統事件基本工作流如下:
通用事件
在系統事件的基礎之上,擴展了應用的通用事件,例如modSetup、modInit等,可以用于編碼實現各插件模塊的設置與初始化
擴展的通用事件如下:
業務自定義事件
如果覺得系統事件、通用事件不足以滿足需要,我們還將事件封裝簡化成BHAppdelgate,你可以通過繼承BHAppdelegate來擴展自己的事件。
注冊
模塊注冊的方式有靜態注冊與動態注冊兩種
-
靜態注冊
通過在BeeHive.plist文件中注冊符合BHModuleProtocol協議模塊類
-
動態注冊
@implementation?HomeModule BH_EXPORT_MODULE()??//聲明該類為模塊入口
在模塊入口類實現中 使用BH_EXPORT_MODULE()宏聲明該類為模塊入口實現類
異步加載
如果設置模塊導出為BH_EXPORT_MODULE(YES),則會在啟動之后第一屏內容展現之前異步執行模塊的初始化,可以優化啟動時時間消耗
編程開發
BHModuleProtocol為各個模塊提供了每個模塊可以hook的函數,用于實現插件邏輯以及代碼實現
-
設置環境變量
通過context.env可以判斷我們的應用環境狀態來決定我們如何配置我們的應用
-(void)modSetup:(BHContext?*)context { switch?(context.env)?{ case?BHEnvironmentDev: //....初始化開發環境 break; case?BHEnvironmentProd: //....初始化生產環境 default: break; } }
-
模塊初始化
如果模塊有需要啟動時初始化的邏輯,可以在modInit里編寫,例如模塊注冊一個外部模塊可以訪問的Service接口
-(void)modInit:(BHContext?*)context { //注冊模塊的接口服務 [[BeeHive?shareInstance]?registerService:@protocol(UserTrackServiceProtocol)?service:[BHUserTrackViewController?class]]; }
-
處理系統事件
系統的事件會被傳遞給每個模塊,讓每個模塊自己決定編寫業務處理邏輯,比如3D-Touch功能
-(void)modQuickAction:(BHContext?*)context { [self?process:context.shortcutItem?handler:context.scompletionHandler]; }
模間調用
通過處理Event編寫各個業務模塊可以實現插件化編程,各業務模塊之間沒有任何依賴,core與module之間通過event交互,實現了插件隔離。但有時候我們需要模塊間的相互調用某些功能來協同完成功能。 通常會有三種形式的接口訪問形式
-
基于接口的實現Service訪問方式(java spring框架實現)
-
基于函數調用約定實現的Export Method(PHP的extension,ReactNatve的擴展機制)
-
基于跨應用實現的Url route模式(iphone app之間的互訪)
我們目前實現了第一種方式,后續會逐步實現后兩種方式
Servcie訪問
Service訪問的優點是可以編譯時檢查發現接口的變更,從而及時修正接口問題。缺點是需要依賴接口定義的頭文件,通過模塊增加得越多,維護接口定義的也有一定工作量。以為HomeServiceProtocol為例
-
定義HomeServiceProtocol暴露模塊對外訪問的接口
@protocol?HomeServiceProtocol?-(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注冊
HomeServiceProtocol BHViewController
-
調用
#import?"BHService.h" id?homeVc?=?[[BeeHive?shareInstance]?createService:@protocol(HomeServiceProtocol)];
單例與多例
對于有些場景下,我們訪問每個聲明為service的對象,希望對象能保留一些狀態,那我們需要聲明這個service對象是一個單例對象。
我們只需要在service對象中實現事件函數
聲明
-(BOOL)?singleton { return?YES; }
通過createService獲取的對象則為單例對象,如果實現上面函數返回的是NO,則createService返回的是多例
id?homeVc?=?[[BeeHive?shareInstance]?createService:@protocol(HomeServiceProtocol)];
上下文環境Context
-
初始化設置應用的項目信息,并在各模塊間共享整個應用程序的信息
-?(BOOL)application:(UIApplication?*)application?didFinishLaunchingWithOptions:(NSDictionary?*)launchOptions { [BHContext?shareInstance].env?=?BHEnvironmentDev;?//定義應用的運行開發環境 [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?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; }
更多細節可以參考Example用例
集成方式
-
use cocoapods
pod "BeeHive", '1.0.0'
作者
- 1005 電子編程入門到工程師--單片機程序框架模塊化加速學習
- 單片機零基礎入門(8-5)模塊化編程
- 電路模塊化電路圖紙參考設計 15次下載
- 【C語言】模塊化編程-通俗易懂
- 藍橋杯模塊化編程
- 【單片機】Keil+Proteus流水燈(模塊化編程)
- 開關電源設計模塊化與并聯技術
- 模塊化逆變電源的設計與應用總結
- 電賽模塊化程序案例下載 12次下載
- FPGA模塊化設計與AlteraHardCopy結構化ASIC 6次下載
- 如何實現單片機C語言的模塊化編程 11次下載
- LCD1602液晶屏的模塊化編程程序和工程文件免費下載 10次下載
- 單片機的C語言模塊化編程 51次下載
- 模塊化編程思想 16次下載
- 012-IIC總線原理和模塊化編程方法 7次下載
- 模塊化插座接線方法有哪些 697次閱讀
- PLC模塊化和結構化編程實例 1091次閱讀
- 模塊化機柜 vs.一體化機柜 745次閱讀
- 如何模塊化編程 1338次閱讀
- 歐姆龍模塊化編程的使用技巧 2068次閱讀
- 如何實現單片機編程的模塊化設計 4783次閱讀
- 協作機器人編程模塊化的需求如何滿足? 3951次閱讀
- PLC模塊化編程和結構化編程 8714次閱讀
- 單片機模塊化編程的原則有哪些 2440次閱讀
- 單片機模塊化編程串口中斷怎么處理 5921次閱讀
- 關于類別化與模塊化設計模式的解釋 5467次閱讀
- 解讀:一種基于模塊化設計的PLM平臺建設 1755次閱讀
- 模塊化UPS電源的構成以及優缺點盤點 7273次閱讀
- 模塊化電源有什么優勢 6755次閱讀
- TAPI軟電話通信系統的模塊化設計 2387次閱讀
下載排行
本周
- 1錦銳科技CA51F2 SDK開發包
- 24.06 MB | 29次下載 | 1 積分
- 2錦銳CA51F005 SDK開發包
- 19.47 MB | 3次下載 | 1 積分
- 310周年文章合集白皮書
- 15.63 MB | 2次下載 | 免費
- 4世界各國&地區常見電壓/頻率/插頭/插座一覽表
- 2.36 MB | 1次下載 | 免費
- 5FS4059B、FS4059C雙節鋰電池充電應用圖
- 0.05 MB | 1次下載 | 免費
- 6MX6200語音芯片使用手冊V1.4
- 1.25 MB | 1次下載 | 免費
- 7蘋果iphone 11電路原理圖
- 4.98 MB | 1次下載 | 2 積分
- 8XILINX XCZU67DR FPGA完整原理圖
- 18.22 MB | 次下載 | 8 積分
本月
- 1AI智能眼鏡產業鏈分析
- 4.43 MB | 354次下載 | 免費
- 2蘇泊爾電磁爐線路的電路原理圖資料合集
- 2.02 MB | 294次下載 | 5 積分
- 3貼片三極管上的印字與真實名稱的對照表詳細說明
- 0.50 MB | 93次下載 | 1 積分
- 4長虹液晶電視R-HS310B-5HF01的電源板電路原理圖
- 0.46 MB | 87次下載 | 5 積分
- 5U盤一鍵制作
- 23.84 MB | 41次下載 | 免費
- 6錦銳科技CA51F2 SDK開發包
- 24.06 MB | 29次下載 | 1 積分
- 7AO4803A雙P通道增強型場效應晶體管的數據手冊
- 0.11 MB | 28次下載 | 2 積分
- 8長虹液晶彩電LS29機芯的技術資料說明
- 3.42 MB | 16次下載 | 2 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935127次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關降壓/升壓雙向直流/直流轉換器 PCB layout 設計
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191388次下載 | 10 積分
- 5十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183342次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81588次下載 | 10 積分
- 7Keil工具MDK-Arm免費下載
- 0.02 MB | 73815次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65988次下載 | 10 積分
評論