资料介绍
软件简介
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< HomeServiceProtocol > homeVc = [[BeeHive shareInstance] createService:@protocol(HomeServiceProtocol)];
单例与多例
对于有些场景下,我们访问每个声明为service的对象,希望对象能保留一些状态,那我们需要声明这个service对象是一个单例对象。
我们只需要在service对象中实现事件函数
声明
-(BOOL) singleton { return YES; }
通过createService获取的对象则为单例对象,如果实现上面函数返回的是NO,则createService返回的是多例
id< HomeServiceProtocol > 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]; idhomeVc = [[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语言的模块化编程 10次下载
- LCD1602液晶屏的模块化编程程序和工程文件免费下载 10次下载
- 单片机的C语言模块化编程 51次下载
- 模块化编程思想 16次下载
- 012-IIC总线原理和模块化编程方法 7次下载
- LumiDL TM模块化照明器介绍 541次阅读
- PLC模块化和结构化编程实例 822次阅读
- 模块化机柜 vs.一体化机柜 601次阅读
- 如何模块化编程 1163次阅读
- 欧姆龙模块化编程的使用技巧 1757次阅读
- 如何实现单片机编程的模块化设计 4631次阅读
- 协作机器人编程模块化的需求如何满足? 3856次阅读
- PLC模块化编程和结构化编程 8545次阅读
- 单片机模块化编程的原则有哪些 2352次阅读
- 单片机模块化编程串口中断怎么处理 5814次阅读
- 关于类别化与模块化设计模式的解释 5339次阅读
- 解读:一种基于模块化设计的PLM平台建设 1628次阅读
- 模块化UPS电源的构成以及优缺点盘点 7046次阅读
- 模块化电源有什么优势 6612次阅读
- TAPI软电话通信系统的模块化设计 2265次阅读
下载排行
本周
- 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次下载 | 免费
评论
查看更多