基于iOS平台的APP模块化开发方法、装置和设备
技术领域
本发明涉及软件开发技术领域,具体涉及一种基于iOS平台的APP模块化开发方法、装置和设备。
背景技术
随着移动互联网的不断发展,很多APP(Application)项目开发中程序代码量和业务越来越多,随着业务发展,APP的规模也逐渐膨胀,代码管理与协作开发变得困难,编译耗时也屡创新高,应用功能的拆分与研发团队的拆分也不可避免。这些发展需要APP架构的变更,以支持大型APP的开发,支持跨团队的协作,现有架构已经不适合业务需求的发展速度,很多项目都面临着重构的问题,而解决方案就是将各个业务拆分成独立模块,从主工程中脱离,进行单独开发、编译、测试,不与其他业务模块相互耦合。模块化开发是近几年被更多采用的APP架构思路。
iOS平台中的模块化开发方法就是将APP项目拆分成多个模块,同时解除各模块间的耦合,最后将所有模块组合起来。目前在模块化开发中常见的方案是通过建立中间件来解除各个模块之间的耦合。对于中间件的技术一般选择路由的形式来解决。目前关于iOS平台下开发中模块化方案比较成熟的是MGJRouter(该种路由方案的名称简写)方案。该方案中通过MGJRouter实现中间件层,并通过MGJRouter路由进行模块间的消息转发。具体的实现原理是在提供服务的组件中提前注册block(iOS开发中的对应代码块),然后在调用方组件中通过URL(Uniform Resource Locator,统一资源定位符)调用block。其中,MGJRouter模块是一个单例对象,负责对其他模块间通信的信息转发,在其内部维护一个“URL->block”格式的注册表,通过该注册表保存服务方注册的block,以及使调用方可以通过URL映射出block,并通过MGJRouter对服务方发起调用。在该方案中MGJRouter是所有模块的调度中心,其负责所有模块的调用、切换、以及特殊处理等操作。而在服务方组件中都对外提供一个PublicHeader,在PublicHeader中声明当前模块所提供的所有功能,这样其他模块想知道模块有什么功能,直接看PublicHeader即可。每一个block都对应一个URL,调用方可以通过URL对block发起调用。
该种MGJRtouter的方案,会对代码块内部对象进行持有,使得各模块间的代码相互依赖,这样易造成循环引用从而对内存消耗过大。
发明内容
本发明提出一种基于iOS平台的APP模块化开发方法、装置和设备,以解决现有技术中内存消耗过大的技术问题。
本发明的技术方案为:
本发明实施例的第一个方面,提供一种基于iOS平台的APP模块化开发方法,包括:
将各模块间的交互划分为数据处理、路由处理和事件监听三部分;
所述数据处理,包括进行各模块的数据共享和数据传递;所述路由处理,包括处理各模块的页面逻辑;所述事件监听,包括进行模块初始化和页面监听。
可选的,所述数据处理包括设置数据组件,通过所述数据组件将数据抽离出来,进行各模块的数据共享和数据传递;
所述数据共享包括步骤:
生成数据共享单例对象以对外提供使用;
对整个APP中的各种类型数据进行存储、删除和/或查询;
所述存储,包括分别建立各种类型数据的数据存储方法,通过键值对形式存入所述数据单例对象,并设置dataStore属性为字典类型;当外部存储各类型数据时调用dataStore属性的setObject:forKey:方法以键值对形式进行存储;
所述查询,包括建立各类型数据的查询方法,基于dataStore属性的objectForKey:方法,通过键的形式来查询相应数据并返回数据;
所述删除,包括建立删除各类型数据的方法,基于调用dataStore的removeObjectForKey:方法,通过预先获取的键来删除对应的数据对象;
将对各类型数据的存储、查询、删除进行封装,以对外提供形成通用的数据共享。
可选的,所述数据传递,包括步骤:
生成数据传递实例对象;
根据所述数据传递实例对象的dataStore属性对需要传递的数据进行封装;
返回所述数据传递实例对象,将封装好的数据作为调用方的数据传递参数进行传递。
可选的,所述数据处理包括对基础类型数据的处理和对特殊类型数据的处理;
所述数据共享中的各种类型数据包括基础类型数据和特殊类型数据,所述基础类型数据包括但不限于字符串、数组、字典、对象、日期;所述特殊类型数据包括但不限于模型对象、图片、二进制数据。
可选的,所述路由处理包括设置路由组件,通过所述路由组件实现跳转路由处理和视图路由处理;
所述跳转路由处理和视图路由处理具体包括:
初始化并生成路由单例对象以对外提供使用;
对跳转路由进行注册,对APP中所有通过跳转路由的路径进行注册,形成跳转路由注册表;
对视图路由进行注册,对APP中所有通过视图路由的路径进行注册,形成视图路由注册表;
接收跳转路径参数,并对其进行解析,在所述跳转路由注册表中进行匹配,匹配成功后跳转到路径目的地;
接收视图路径参数,并对其进行解析,在所述视图路由注册表中进行匹配,匹配成功后跳转到视图目的地。
可选的,所述事件监听包括设置事件监听组件,通过所述事件监听组件进行模块初始化和页面监听;
所述模块初始化包括:获取事件通知并基于事件通知实现模块自注册,通过预先获取的事件优先级和同异步设定信息,来进行模块初始化的排序和管理;
所述页面监听包括:设置用于页面展示的监听接口,使所述监听接口保留回调,待页面回到前台再执行。
可选的,该方法还包括模块动态化处理的步骤,所述模块动态化处理的步骤包括:
通过协议扩展,注册协议路由https和reacts,使其他模块可以通过路由调用这些页面,扩展后,使用路由跳转到H5页面;
做Native与JavaScript容器之间的桥接,在WebView上使用WebViewJavaScriptBridge作为JavaScript的桥接,在React Native通过添加NativeModule来做桥接,调用所述路由组件和所述事件监听组件以及所述数据组件分别来处理路由跳转、事件通知和数据请求;
通过所述数据组件来支持特殊类型数据的处理,使所述特殊类型数据能在原生组件和JavaScript之间传递,所述特殊类型的数据包括但不限于NSDate、NSData、UIImage、Model;
和/或,该方法还包括支持离线包的步骤,包括通过以下两种方式进行协议扩展来支持离线包:
基于离线包的H5容器,路由URL形式是ophttp://组件/页面。
基于离线包的React-Native容器,路由URL格式是oprn://组件/页面。
可选的,该方法还包括模块分层的步骤,所述模块分层包括:
将各模块进行分层,划分为业务层、公共服务层和基础层;
将各个业务模块划分进所述业务层;将网络模块、公共UI模块、缓存模块划分进所述公共服务层;将AFNetworking、SDWebImage、资源文件、配置文件划分进基础层。
本发明实施例的第二个方面,还提供一种基于iOS平台的APP模块化开发装置,包括与被拆分的多个模块通信连接的中间件,所述中间件用于:
将各模块间的交互划分为数据处理、路由处理和事件监听三部分;
进行数据处理,包括进行各模块的数据共享和数据传递;
进行路由处理,包括处理各模块的页面逻辑;
进行事件监听,包括模块初始化和页面监听。
本发明实施例的第三个方面,还提供一种电子设备,包括处理器以及与所述处理器通信连接的存储器,所述存储器存储有被所述处理器执行的程序指令,所述处理器调用所述程序指令能够执行上面任一项所述的方法。
本发明公开的技术效果为:
本发明提出的基于iOS平台的APP模块化开发方法、装置和设备,通过路由、事件监听、数据三部分来提供对各模块间通信的支持,通过数据处理将数据抽离出来,进行各模块的数据共享和数据传递;通过路由处理各模块的页面逻辑;通过事件监听,进行模块初始化和页面监听,该方案实现了各模块间充分解耦并减少了各模块间的代码相互依赖,从而避免了代码相互依赖而造成的循环引用,降低对内存的消耗。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明基于iOS平台的APP模块化开发方法的一个实施例的流程示意图;
图2为本发明基于iOS平台的APP模块化开发方法的一个优选实施例中开发架构示意图;
图3为本发明基于iOS平台的APP模块化开发方法的一个优选实施例中页面监听流程示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例1
本发明实施例1提供一种基于iOS平台的APP模块化开发方法,在将待开发的APP项目拆分为多个模块后,参加图1所示,该方法包括步骤:
步骤S11,将各模块间的交互划分为数据处理、路由处理和事件监听三部分。
即,将中间件所需实现的各模块之间的交互任务,通过数据处理、路由处理和事件监听三部分来完成。
各模块即拆分后的各个模块。
步骤S12,进行数据处理,包括进行各模块的数据共享和数据传递。
数据共享,共享的是所有模块都可以获取的数据,数据传递的数据可以附着在路由和事件中传递。
步骤S13,进行路由处理,包括处理各模块的页面逻辑。
步骤S14,进行事件监听,包括进行模块初始化和页面监听。
模块初始化,即基于事件通知实现模块自注册,通过事件中优先级和同步异步设定,进行模块初始化管理。
页面监听,即提供一种适用于页面展示的监听接口,该监听接口会保留回调,直到页面会到前台才执行,且同名的通知,不会出现重复处理,只会使用最新的数据执行一次。
其中步骤S12、S13和S14编号的先后顺序并不表征对应步骤的操作时序上的先后,步骤S12-S14的执行不存在时序上必然的先后逻辑关系。
本发明实施例中,中间件通过路由、事件监听、数据三部分来提供对各模块间通信的支持,这样一来各模块间通信时可以调用路由、事件监听、数据而不用自行实现相应功能,达到了充分解耦也能够大幅度减少了各模块间自行实现上述三部分功能时相互调用产生的的代码依赖,同时也避免了代码相互依赖所造成的循环引用现象对内存的消耗。
实施例2
本发明实施例2提供基于iOS平台的APP模块化开发方法的一个优选实施例。
在iOS平台项目开发中,通常将组件理解为较小的功能块,而较大粒度的业务功能成为模块。一个APP会包含很多模块,模块之间会相互调用,相互通信。因此为了解决模块间相互依赖,快速开发构建项目的问题,在该优选实施例中,对模块进行分层,具体架构图参见图2所示。
作为一种优选实施方式,主要分为业务层,公共服务层,基础层。其中业务层有各个业务模块组成,例如图2中所示业务1-业务4即指业务模块1-4;公共服务层由网络模块、公共UI模块、缓存模块组成;基础层由AFNetworking、SDWebImage、资源文件、配置文件组成。
将模块按照上述方式进行分层的好处是有利于维护管理公共服务层和基础层各个模块内容。具体表现在:便于将零散琐碎的基础层模块内容统一起来,编译成一个整体,减少了模块数量,能够在一定程度上优化APP的整体架构;同时能够很好的处理基础层中的.a和.framework静态库。
在iOS平台项目开发中,各个模块之间相互通信是模块化开发中核心技术点。一般的模块化方案,强调通过一种协议机制或者target-action的方式来实现。目前现有技术中比较成熟的方案中存在着上述消耗内存的缺点。
本发明实施例中,为了避免中间件路由方案对于内存的消耗以及提供特殊类型的支持,分别提供了路由组件、数据组件、事件监听组件三个部分,路由组件由跳转路由和视图路由两种;数据组件提供了对基础类型和特殊类型数据的支持以及各模块通信中数据共享和数据传递场景的支持;事件监听机制实现了更加灵活的跨模块通信。
通过数据组件部分所执行的数据处理包括:
首先将各模块之间通信交互所需的数据抽离出来,进行数据共享和传递。作为模块通信交互的一部分,各个模块间数据交互分为两个部分:
(1)数据共享:共享的是所有模块都可以获取的数据。
(2)数据传递:模块间通信通过路由或事件通信交互时传递的数据。
单的数据组件能够解决特殊类型数据的问题。本发明实施例中支持特殊类型数据,如图片、二进制数据,Model类型等。
作为一种优选的可实施方式,数据组件提供对基础数据类型和特殊数据类型的支持,以及对外提供数据共享和数据传递,具体实现流程如下:
S201.首先初始化数据组件,生成数据组件单例对象已对外提供使用。
S202.数据共享,对整个APP中的各种类型数据进行存储,删除,查询方法。
其中存储包括:
首先分别建立字符串、数组、字典、对象、日期等基础类型以及图像,模型对象等特殊类型的数据存储方法;通过键值对形式存入数据组件单例对象设置dataStore属性,该属性为字典类型;当外部存储各类型数据时调用dataStore属性的setObject:forKey:方法以键值对形式进行对数据进行存储。
其次建立各类型数据的查询方法:
具体实现是通过dataStore属性的objectForKey:方法通过“键”的形式来查询相应数据并返回数据。
提供删除各类型对象数据的方法:
通过调用dataStore的removeObjectForKey:方法通过给定的“键”来删除对应的数据对象。
最后对各类型数据存储、查询、删除方法进行封装已对外提供形成通用数据共享方法,具体实现为:
在数据共享方法中接收需要存储数据参数,通过isKindOfClass:方法判断数据类型从而调用相应类型的数据存储方法进行数据存储。
S203.在数据组件中进行数据传递,具体实现流程如下所示:
首先生成数据实例对象;
其次通过数据实例对象的dataStore属性方法对需要传递的数据进行封装;
最后返回该数据实例对象,以作为调用放的数据传递参数。作为其中一种可实施方式,实现本发明数据传递的代码实现流程为:
ZDData*data=[ZDData dataTransmit];//通过数据传递方法生成数据实例对象
[data setString:@“Modlesss”forKey:@“name”];//调用数据对象方法对需要传递数据进行封装
[ZDEvent postEventWithName:@“UserName"withDataload:data];//将封装好的数据作为参数进行传递。
该代码流程仅为实现本发明数据传递的诸多实施方式中的一个举例,本领域技术人员能够根据本发明技术方案得到其他多种代码实现流程,本发明实施例不一一列举。
本发明实施例中,各业务模块中页面逻辑的处理由路由负责,本发明实施例中定义了两种路由:
(1)跳转路由:进行页面跳转,比如通过UINavigationController的push打开一个新的页面。
(2)视图路由:返回一个界面元素,即返回一个UIViewController以满足嵌套页面的需求,比如侧边栏,Tab栏等页面。
本方案中的路由的主要流程可以概括为如下所示:
router://{moduleName}/{pageName}。
作为一种可实施方式,路由组件中具体实现流程如下:
S211.首先初始化路由组件,生成路由组件单例对象已对外提供使用。
S212.对跳转路由进行注册,对APP中所有通过跳转路由的路径进行注册形成跳转路由注册表。
S213.对视图路由进行注册,对APP中所有通过试图路由的路径进行注册,形成视图路由注册表。
S214.创建跳转路由方法,在该方法中接收跳转路径参数,并对其进行解析。在跳转路由注册表中进行匹配,匹配成功后跳转到路径目的地。
S215.创建视图路由方法,在该方法中接收视图路径参数,并对其进行解析。在视图路由注册表中进行匹配,匹配成功后跳转到视图目的地。
本发明实施例中,采用事件监听机制,能够实现更加灵活方便的跨模块通信。
在事件实现中,本发明实施例提供了更好用的接口,使事件支持同步、异步、优先级设定,并且实现两个功能:
(1)模块初始化:基于事件通知实现模块自注册,通过事件中的优先级和同异步设定,来进行模块初始化的排序和管理。
作为一种可实施方式,通过登录模块的初始化,将对应的代码放在登录模块内部,当接入登录模块时,就会在启动时自动初始化,以注册路由。
(2)页面监听:提供一种适用于页面展示的监听接口,该监听接口会保留回调直到页面回到前台才执行。回调,即iOS中将一段可执行的代码和一个特定的事件绑定起来,当特定的事件发生时,就会执行这段代码。
作为一种可实施方式,页面监听的主要流程参见图3所示。
在当前移动互联网行业中,APP的动态化需求越来越多,因此使用H5和ReactNative成为了很多项目的选择,因此,优选地,在本发明实施例中,提供了模块动态化方案:
在该方案中不仅提供了对iOS平台中原生页面的支持,也提供了对WebView容器和React Native的支持,以此使这两类业务组件能够像原生一样通过该方案接入组件化系统。作为一种可实施方式,具体实现流程如下:
第一:通过协议扩展,注册协议路由:https和reacts,使其他组件可以通过路由调用这些页面,扩展后,我们可以使用路由跳转到H5页面:
[self jumpTo:@"url/login H5页面"];
第二,做Native与容器之间的桥接,在WebView上使用WebViewJavaScriptBridge作为JavaScript的桥接,在React Native通过添加Native Module来做桥接,调用路由组件和数据组件来处理路由跳转、事件通知和数据请求。路由与通知比较简单,重点是对特殊类型数据的处理,本发明实施例通过数据组件来支持特殊类型的数据NSDate、NSData、UIImage、Model等特殊类型的处理,能在原生和JavaScript之间传递。
在本发明实施例中,根据本发明实施例技术方案,设置相应的原生组件中Objective-C代码以及扩展容器的JavaScript代码,通过桥接处理,使WebView和ReactNative容器接入了模块化,可以实现通过中间件层调用其他模块,也可以通过中间件层被其他模块调用,使得这两个容器在使用和表现上与原生组件一样。
更优地,本发明实施例为了更好地使用JavaScript容器,还提供了离线包方案。离线包是将APP内部应用资源打包整合,统一管理下发,以使APP可以在离线的情况下,使用本地资源加载页面。使用离线包能够节约用户流量,提高页面加载速度,提高用户体验。一种方案中实现的离线包具体采用bsdiff进行差分,支持上传到oss,支持跟随APP打包,且拥有一个有趣的签名机制。
作为一种可实施方式,本发明实施例中通过以下两种方式进行协议扩展来提供离线包支持:
ophttp:基于离线包的H5容器,路由URL形式是ophttp://组件/页面。
oprn:基于离线包的React-Native容器,路由URL格式是oprn://组件/页面。
在本发明实施例中,中间件通过路由、事件、监听为各个模块之间通信提供了支持,并且实现了模块之间的代码完全无依赖。模块通信时,只需要知道要调用的路由地址、事件名称、以及数据类型,只需要知道这些声明即可。
并且,在该方案中提供的模块动态化方案能够使H5和React Native两类业务组件能够像原生一样通过该方案接入组件化系统。
实施例3
本发明实施例还提供一种基于iOS平台的APP模块化开发装置,包括与被拆分的多个模块通信连接的中间件。在本发明实施例中,该中间件用于:
将各模块间的交互划分为数据处理、路由处理和事件监听三部分;
进行数据处理,包括将交互数据抽离出来,进行各模块的数据共享和数据传递;进行路由处理,包括处理各模块的页面逻辑;进行事件监听,包括模块初始化和页面监听。
实施例4
本发明实施例还提供一种电子设备,包括处理器以及与该处理器通信连接的存储器,在本发明实施例中,该存储器存储有可被处理器执行的程序指令,处理器调用该程序指令能够执行实施例1或者实施例2所述的方法。
本发明实施例中,设置数据组件,通过数据组件将数据抽离出来,并支持基础类型和特殊类型数据,同时提供数据共享和数据传递来支持模块间数据交互;设置事件监听机制,通过开放接口来支持同步、异步,同时提供了模块初始化和界面监听;设置路由组件,通过跳转路由和视图路由处理各模块页面逻辑。同时,优选地,本发明实施例还提供模块动态化方案,在该方案中提供的模块动态化方案能够使H5和React Native两类业务组件能够像原生一样通过该方案接入组件化系统。
本发明实施例中,中间件通过路由、事件监听、数据三部分来提供对各模块间通信的支持,这样一来各模块间充分解耦并减少了各模块间的代码相互依赖,从而避免了代码相互依赖容易造成循环引用现象对内存的消耗;同时,数据组件提供对特殊数据类型的支持避免了现有技术中不支持特殊数据类型的弊端;模块的动态化能够让该方案满足项目开发中的动态化需求,具有可扩展性,实用性更强。
本发明说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处。综上所述,本说明书内容不应理解为对本发明的限制。