資料介紹
軟件簡介
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 电子编程入门到工程师--单片机程序框架模块化加速学习15次下载
- 单片机零基础入门(8-5)模块化编程20次下载
- 电路模块化电路图纸参考设计15次下载
- 【C语言】模块化编程-通俗易懂10次下载
- 蓝桥杯模块化编程9次下载
- 【单片机】Keil+Proteus流水灯(模块化编程)15次下载
- 开关电源设计模块化与并联技术18次下载
- 模块化逆变电源的设计与应用总结9次下载
- 电赛模块化程序案例下载12次下载
- FPGA模块化设计与AlteraHardCopy结构化ASIC6次下载
- 如何实现单片机C语言的模块化编程11次下载
- LCD1602液晶屏的模块化编程程序和工程文件免费下载10次下载
- 单片机的C语言模块化编程51次下载
- 模块化编程思想16次下载
- 012-IIC总线原理和模块化编程方法7次下载
- 模块化插座接线方法有哪些1227次阅读
- LumiDL TM模块化照明器介绍920次阅读
- PLC模块化和结构化编程实例1255次阅读
- 模块化机柜 vs.一体化机柜854次阅读
- 如何模块化编程1466次阅读
- 欧姆龙模块化编程的使用技巧2221次阅读
- 如何实现单片机编程的模块化设计4914次阅读
- 协作机器人编程模块化的需求如何满足?4054次阅读
- PLC模块化编程和结构化编程8810次阅读
- 单片机模块化编程的原则有哪些2498次阅读
- 关于类别化与模块化设计模式的解释5570次阅读
- 解读:一种基于模块化设计的PLM平台建设1840次阅读
- 模块化UPS电源的构成以及优缺点盘点7356次阅读
- 模块化电源有什么优势6813次阅读
- TAPI软电话通信系统的模块化设计2479次阅读
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論