资料介绍
软件简介
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'
作者
- 单片机编程技巧—状态机编程 11次下载
- 1005 电子编程入门到工程师--单片机程序框架模块化加速学习 13次下载
- 单片机零基础入门(8-5)模块化编程 20次下载
- 电路模块化电路图纸参考设计 7次下载
- 【C语言】模块化编程-通俗易懂 10次下载
- 经验分享|十年老司机的单片机模块化编程 32次下载
- 蓝桥杯模块化编程 9次下载
- 【单片机】Keil+Proteus流水灯(模块化编程) 14次下载
- 电赛模块化程序案例下载 12次下载
- 如何实现单片机C语言的模块化编程 10次下载
- LCD1602液晶屏的模块化编程程序和工程文件免费下载 10次下载
- 单片机的C语言模块化编程 48次下载
- 模块化编程思想 16次下载
- 012-IIC总线原理和模块化编程方法 7次下载
- 用模块化的思想来武装你的keil编程(一) 91次下载
- 模块化原理和方法 模块化的方法和注意事项 1421次阅读
- PLC模块化和结构化编程实例 580次阅读
- 如何模块化编程 848次阅读
- 嵌入式之状态机编程 542次阅读
- 欧姆龙模块化编程的使用技巧 1317次阅读
- 如何实现单片机编程的模块化设计 4332次阅读
- 如何使用Substrate框架来构建自己的区块链 3599次阅读
- 协作机器人编程模块化的需求如何满足? 3711次阅读
- PLC模块化编程和结构化编程 8314次阅读
- 单片机模块化编程的原则有哪些 2237次阅读
- 单片机模块化编程串口中断怎么处理 5512次阅读
- 解读:一种基于模块化设计的PLM平台建设 1480次阅读
- 模块化电源有什么优势 6461次阅读
- TAPI软电话通信系统的模块化设计 2061次阅读
- 基于DSP的模块化教育机器人硬件系统方案 1933次阅读
下载排行
本周
- 1储能电源市场分析
- 7.99 MB | 7次下载 | 免费
- 2储能电源市场分析报告
- 2.61 MB | 6次下载 | 免费
- 3磁环电感定制时应该注意什么
- 0.32 MB | 2次下载 | 免费
- 4具有DCS-Control™ 功能的 3V 到 17V 0.5A 降压转换器TPS6217x-Q1数据表
- 3.17MB | 1次下载 | 免费
- 5labview文档教程资料(一)
- 24.29 MB | 1次下载 | 免费
- 6集成电流镜的 TPS61391 85VOUT 升压转换器数据表
- 1.54MB | 次下载 | 免费
- 7NCV7755 简单评估板数据手册
- 1.43 MB | 次下载 | 免费
- 8低纹波开关电容降压调节器LM2772数据表
- 2.08MB | 次下载 | 免费
本月
- 1ES9038PRO解码芯片的电路原理图介绍
- 0.25 MB | 35次下载 | 5 积分
- 2UHD智能显示SoC VS680产品简介
- 0.46 MB | 11次下载 | 免费
- 3STM32国内外发展现状
- 1.15 MB | 11次下载 | 免费
- 4ATmega8芯片中文手册
- 2.45 MB | 8次下载 | 1 积分
- 5TDK电容器产品指南
- 11.88 MB | 7次下载 | 1 积分
- 6储能电源市场分析
- 7.99 MB | 7次下载 | 免费
- 7传感芯片选型指南
- 3.60 MB | 6次下载 | 免费
- 8储能电源市场分析报告
- 2.61 MB | 6次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935086次下载 | 免费
- 2开源硬件-PMP21529.1-4 开关降压/升压双向直流/直流转换器 PCB layout 设计
- 1.48MB | 420050次下载 | 免费
- 3Altium DXP2002下载入口
- 未知 | 233068次下载 | 免费
- 4电路仿真软件multisim 10.0免费下载
- 340992 | 191316次下载 | 免费
- 5十天学会AVR单片机与C语言视频教程 下载
- 158M | 183316次下载 | 免费
- 6labview8.5下载
- 未知 | 81567次下载 | 免费
- 7Keil工具MDK-Arm免费下载
- 0.02 MB | 73786次下载 | 免费
- 8NI LabVIEW中实现3D视觉的工具和技术
- 未知 | 70088次下载 | 免费
评论
查看更多