电子发烧友App

硬声App

0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示
电子发烧友网>电子资料下载>电子资料>BeeHive iOS模块化编程框架

BeeHive iOS模块化编程框架

2022-06-24 | zip | 0.29 MB | 次下载 | 2积分

资料介绍

授权协议 GPL
开发语言 Objective-C
软件类型 开源软件
所属分类 iOS代码库

软件简介

BeeHive是用于ios的app模块化编程的框架实现方案,吸收了Spring框架service的理念来实现模块间的API耦合。基本原理如下:

pYYBAGKrCX2AD0gvAABTwfS5_OY744.jpg

实现以下特性

  • 插件化的模块开发运行框架

  • 模块具体实现与接口调用分离

  • 模块生命周期管理,扩展了应用的系统事件

因为基于Spring的Service理念,虽然可以使模块间的具体实现与接口解耦,但无法避免对接口类的依赖关系。

为什么不使用invoke以及动态链接库技术实现对接口实现的解耦,类似Apache的DSO的方式。

主要是考虑学习成本难度以及动态调用实现无法在编译检查阶段检测接口参数变更等问题,动态技术需要更高的编程门槛要求

BeeHive灵感来源于蜂窝。蜂窝是世界上高度模块化的工程结构,六边形的设计能带来无限扩张的可能。所以我们用了BeeHive来做为这个项目的命名。

生命周期的变化

事件

BeeHive会给每个模块提供生命周期事件,用于与BeeHive宿主环境进行必要信息交互 事件分为三种类型:

  • 系统事件

  • 通用事件

  • 业务自定义事件

系统事件

系统事件通常是Application生命周期事件,例如DidBecomeActive、WillEnterBackground等 系统事件基本工作流如下:

poYBAGKrCX-AHIaBAACnKX05rbo986.jpg

通用事件

在系统事件的基础之上,扩展了应用的通用事件,例如modSetup、modInit等,可以用于编码实现各插件模块的设置与初始化

扩展的通用事件如下:

pYYBAGKrCYGAcNFoAADSk_QeXLw314.jpg

业务自定义事件

如果觉得系统事件、通用事件不足以满足需要,我们还将事件封装简化成BHAppdelgate,你可以通过继承BHAppdelegate来扩展自己的事件。

注册

模块注册的方式有静态注册与动态注册两种

  • 静态注册

通过在BeeHive.plist文件中注册符合BHModuleProtocol协议模块类

poYBAGKrCYOAF-W2AAA6G49Ausw974.png

  • 动态注册

@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];
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'

作者

一渡, shijie.qinsj@alibaba-inc.com

达兹, dazi.dp@alibaba-inc.com

 

下载该资料的人也在下载 下载该资料的人还在阅读
更多 >

评论

查看更多

下载排行

本周

  1. 1山景DSP芯片AP8248A2数据手册
  2. 1.06 MB  |  532次下载  |  免费
  3. 2RK3399完整板原理图(支持平板,盒子VR)
  4. 3.28 MB  |  339次下载  |  免费
  5. 3TC358743XBG评估板参考手册
  6. 1.36 MB  |  330次下载  |  免费
  7. 4DFM软件使用教程
  8. 0.84 MB  |  295次下载  |  免费
  9. 5元宇宙深度解析—未来的未来-风口还是泡沫
  10. 6.40 MB  |  227次下载  |  免费
  11. 6迪文DGUS开发指南
  12. 31.67 MB  |  194次下载  |  免费
  13. 7元宇宙底层硬件系列报告
  14. 13.42 MB  |  182次下载  |  免费
  15. 8FP5207XR-G1中文应用手册
  16. 1.09 MB  |  178次下载  |  免费

本月

  1. 1OrCAD10.5下载OrCAD10.5中文版软件
  2. 0.00 MB  |  234315次下载  |  免费
  3. 2555集成电路应用800例(新编版)
  4. 0.00 MB  |  33566次下载  |  免费
  5. 3接口电路图大全
  6. 未知  |  30323次下载  |  免费
  7. 4开关电源设计实例指南
  8. 未知  |  21549次下载  |  免费
  9. 5电气工程师手册免费下载(新编第二版pdf电子书)
  10. 0.00 MB  |  15349次下载  |  免费
  11. 6数字电路基础pdf(下载)
  12. 未知  |  13750次下载  |  免费
  13. 7电子制作实例集锦 下载
  14. 未知  |  8113次下载  |  免费
  15. 8《LED驱动电路设计》 温德尔著
  16. 0.00 MB  |  6656次下载  |  免费

总榜

  1. 1matlab软件下载入口
  2. 未知  |  935054次下载  |  免费
  3. 2protel99se软件下载(可英文版转中文版)
  4. 78.1 MB  |  537798次下载  |  免费
  5. 3MATLAB 7.1 下载 (含软件介绍)
  6. 未知  |  420027次下载  |  免费
  7. 4OrCAD10.5下载OrCAD10.5中文版软件
  8. 0.00 MB  |  234315次下载  |  免费
  9. 5Altium DXP2002下载入口
  10. 未知  |  233046次下载  |  免费
  11. 6电路仿真软件multisim 10.0免费下载
  12. 340992  |  191187次下载  |  免费
  13. 7十天学会AVR单片机与C语言视频教程 下载
  14. 158M  |  183279次下载  |  免费
  15. 8proe5.0野火版下载(中文版免费下载)
  16. 未知  |  138040次下载  |  免费