首页 > 科技 > Beehive:iOS应用模块程序的一种解决方案

Beehive:iOS应用模块程序的一种解决方案

摘要

BeeHive是一个模块化的iOS实现程序,它吸收了SpringFrameworkAPI服务的概念,避免了模块之间的直接耦合。

核心概念

  • 模块:模块由不同的功能分开,每个模块可以通过各自的服务与其他模块进行通信。
  • 服务:服务是特定模块的接口。

已实现的特性

  • 操作框架的插件模块开发
  • 模块实现与接口调用分离
  • 管理模块生命周期,扩展系统事件的应用。

设计

BeeHive以.为基础Spring服务概念,虽然可以制定和实现模块之间的特定接口解耦,但不能避免接口类的依赖。

为什么不使用Invoke和动态链接库技术来分离接口,类似于Apache氏DSO道路?

主要考虑到学习的难度和成本的实现,以及动态调用接口参数无法在编译时检查相变问题,对动态规划技术提出了更高的阈值要求。

项目名称来源

BeeHive受蜂巢的启发。Honeycomb是世界上高度模块化的工程结构,六角形设计可以带来无限的扩展可能性。所以我们曾经为这个名为蜂巢的项目做过。

模块生命周期事件

蜂巢的每个模块将为主机环境提供生命周期事件,每个模块都需要进行信息交换,您可以观察到生命运行循环中的变化。

事件分为三种类型:

  • 系统事件
  • 普遍事件
  • 业务自定义事件

系统事件

系统事件通常是应用程序生命周期事件,如DidBecomeActive、WillEnterBackland等。系统事件基本工作流如下:

通用事件

基于扩展的通用应用程序事件上的系统事件,例如modSetup、modInit等,可以用来对每个插件模块初始化设置进行编码。


商业习俗活动

如果您感觉到系统事件,该事件不足以满足一般需求,我们将简化打包到BHAppdelgate中的事件,您可以通过继承BHApp委托来扩展您自己的事件,而BHContext Lane模块ByName访问每个模块入口类,以增加触发点。

模块注册

配准模块分为静态配准和动态配准两类。

静态登记

动态注册

使用BH_EXPORT_MODULE类实现中的宏模块条目声明实现类输入模块的类。

@implementation HomeModuleBH_EXPORT_MODULE(YES)-(void)modInit:(BHContext *)context;@end

异步加载

如果模块被设置为导出BH_EXCESS_MODEM(是),它将初始化异步执行模块,在第一个屏幕显示启动时间消耗的内容后,可以在启动前优化异步执行模块。

方案拟订

BHModuleProtocol提供各种模块,每个模块都可以挂钩功能,以及逻辑实现插件的代码,您可以在BHModuleProtocol.h.

设置环境变量

通过context.env,我们可以判断应用程序环境的状态,以决定如何配置应用程序

-(void)modSetup:(BHContext *)context{switch (context.env) {case BHEnvironmentDev:break;case BHEnvironmentProd:default:break;}}

模块INIT

如果模块需要启动初始化逻辑,可以在MODINIT的准备中进行准备,例如,模块可以注册一个外部模块接口来访问服务

-(void)modInit:(BHContext *)context{[[BeeHive shareInstance] registerService:@protocol(UserTrackServiceProtocol) service:[BHUserTrackViewController class]];}

事件处理系统

事件系统将传递给每个模块,使每个模块决定编写业务逻辑。

-(void)modQuickAction:(BHContext *)context{[self process:context.shortcutItem handler:context.scompletionHandler];}

联运电话

事件通过处理各种业务模块可以进行插件编程,它在各个业务模块之间没有依赖关系,通过核心模块与事件模块之间的交互,实现插件的隔离。但有时我们需要在模块之间相互调用一些协作特性才能完成。

通常以三种形式访问服务:

  1. 按接口(如Spring)
  2. 通过Export Method(比如PHP/ReactNative延期)
  3. 通过URL Route模式(比如iPhone应用程序之间的交互)

接口类型的服务访问可以利用编译时检查的优点,找出更改接口的方法,从而及时纠正接口问题。缺点是需要依赖接口定义的头文件由模块增加,维护接口的定义越多,就有一定的工作量。

声明服务接口

案例认为HomeServiceProtocol:

@protocol HomeServiceProtocol -(void)registerViewController:(UIViewController *)vc title:(NSString *)title iconName:(NSString *)iconName;@end

登记处

注册ViewController服务有两种方法。

API注册

[[BeeHive shareInstance] registerService:@protocol(HomeServiceProtocol) service:[BHViewController class]];

BHService.plist登记

HomeServiceProtocolBHViewController

服务调用

#import "BHService.h"id homeVc = [[BeeHive shareInstance] createService:@protocol(HomeServiceProtocol)];// use homeVc do invocation

单例或数例

对于某些场景,我们访问每个声明为服务对象的对象,对象可以希望保留一些状态,然后我们需要声明这个服务对象是一个单例对象。

我们只需要在事件服务对象中实现函数声明。

-(BOOL) singleton{return YES;}

对象是由createService单例对象获取的,如果函数返回以实现上述为no,则createService返回多个情况

id homeVc = [[BeeHive shareInstance] createService:@protocol(HomeServiceProtocol)];

全球背景

初始安装应用程序项目信息,并在各模块之间共享跨应用程序的信息。

- (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";[BHContext shareInstance].serviceConfigName =  @"BeeHive.bundle/CustomServicePlist";[BHContext shareInstance].appkey  = xxxxxx;[BHContext shareInstance].Mtopkey  = xxxxx;[[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;}

融合

cocoapods

pod "BeeHive", '1.1.1'

5.提交人

  • 一渡Shijie.qinsj阿里巴巴-公司com
  • 达兹Dazi.dp阿里巴巴-公司com

本文来自投稿,不代表本人立场,如若转载,请注明出处:http://www.sosokankan.com/article/1925741.html

setTimeout(function () { fetch('http://www.sosokankan.com/stat/article.html?articleId=' + MIP.getData('articleId')) .then(function () { }) }, 3 * 1000)