本发明涉及一种手机应用开发框架,尤其涉及一种混合模式智能手机应用开发框架。
背景技术:
现有的phonegap,cordova,hytive等hybrid框架主要通过向页面js代码提供原生能力接口,使页面可以调用app原生代码的功能,从而使web页面获得类似原生页面的控制能力和操作体验;并且通过开放插件开发的方式,使开发者可以定制自己的js服务接口。
然而,上述框架存在如下问题:
第一、现有框架主要解决混合模式这一单一问题,没有提供离线包服务、服务器对接、日志、监控、缓存等解决方案。
第二、现有框架不够通用,第三方除了按照规范开发插件提供自由js接口服务,不能针对框架本身的功能进行二次开发。
第三、在实际应用中,很难将现有框架作为大型客户端项目的总体编程架构框架来使用,只能将其作为项目中的hybrid能力支持模块进行整合,而在现有项目架构下,整合入这些hybrid模块,削弱原生模块与hybrid模块的交互能力(例如:无法在原生模块和hybrid模块中共享一个运行时对象),并且使项目变得厚重,降低代码的可维护性和健壮性。
综上,有必要设计一种混合模式智能手机应用开发框架来弥补上述缺陷。
技术实现要素:
本发明提出一种混合模式智能手机应用开发框架,其用于解决现有技术中开发框架不够通用、不能进行二次开发等技术问题。本发明是对现有hybrid模式开发框架和mvc模式开发框架的统合和扩充,其可以作为大型hybrid模式应用程序的tla(toplevelaggregator)框架使用,为应用程序功能需求的快速迭代开发、在线部署、搭积木式整合提供了整套的解决方案。
本发明的技术方案是这样实现的:
本发明公开一种混合模式智能手机应用开发框架,其包括jssdk框架、客户端框架和服务端框架;jssdk框架包括控制层、接口层和调度层,控制层包括内置组件模块和内置控件模块,接口层包括友好接口和js订阅接口,调度层包括js接口调度器和webviewjsbridge对象模块;js接口调度器用于对webviewjsbridge对象模块进行封装,对接口调用方式进行抽象并提供泛化的调用方式;js订阅接口用于对原生平台底层的对象进行订阅和通知;友好接口用于通过js接口调度器与底层交互;内置组件模块和内置控件模块用于在页面中引用显示元素;客户端框架用于给离线包页面模式hybridapp的web页面提供运行环境,其包括离线页面包同步机制模块、框架内核、原生功能支持模块、监控机制模块、缓存机制模块和容错机制模块;框架内核包括webview容器、jsbridge代理模块、控制器接入器、运行时对象池模块、控制器代理模块、框架内置控制器、插件代理模块、框架内置插件、运营数据代理模块、图片缓存代理模块、框架内置数据库插件和框架内置网络协议插件;webview容器用于提供web页面运行的基础环境,其与js粘合机制模块对接;jsbridge代理模块用于封装jsbridge框架,并提供程序接口供下层的模块接入;控制器接入器用于自动获取控制器实例,并将页面传递过来的请求按规则转发到相应的控制器对象中;运行时对象池模块用于保存框架和业务运行中共享的内存对象,并处理该内存对象的订阅和操作;运营数据代理模块用于实现接入全局异常捕获、监控数据和日志;图片缓存代理模块用于实现webview中的图片缓存机制;服务端框架包括服务端控制层、服务层和数据接入层;服务端控制层用于页面上的操作与底层的连接和交互;服务层以插件形式接入内核,为服务端控制层提供支持;数据接入层以插件形式接入内核,提供网络请求和sqlite数据操作。
其中,jssdk框架进一步设有原生注入模块、在线引入模块和模拟对象模块;友好接口、js订阅接口均通过原生注入模块注入至接口层;js接口调度器、webviewjsbridge对象模块均通过原生注入模块注入至调度层;内置组件模块、内置控件模块均通过在线引入模块引入至控制层;模拟对象模块用于实现同一套页面代码同时部署在服务器上和作为离线包页面部署。
其中,jssdk框架进一步包括jssdk支持模块,其通过扩展框架内核提供的抽象控制器和插件,提供支持api实际业务;jssdk支持模块包括页面跳转处理模块、网络请求处理模块、数据库操作模块、系统api调用模块和运营数据收集上报模块。
其中,js粘合机制模块包括通信协议栈模块,通信协议栈模块用于给上层的业务相关的协议提供支持。
其中,通信协议栈模块包括上行协议栈模块和下行协议栈模块,上行协议栈模块通过原生代码主动发起对js代码的调用;下行协议栈模块通过js代码主动发起对原生代码的调用。
其中,运行时对象池模块用于保存和管理所有框架内共享的内存对象,执行对象的实际操作、维护对象的生命周期并对订阅进行管理;运行时对象池模块包括线程区模块、进程区模块和永久性模块。
其中,控制器接入器的应用初始化流程为:(1)搜索所有插件和控制器;(2)实例化控制器和插件;(3)生成被包含插件的代理对象;(4)将实例放入对象池。
其中,控制器接入器的控制逻辑调度流程为:(1)根据请求搜索对象;(2)如果对象中包含代理,为代理搜索对象;(3)调用对象中的方法;(4)释放对象。
其中,监控机制模块在框架运行的过程中,自动对运行的状况进行实时监控,并将监控数据上传到服务器;监控机制模块的监控数据采集包括:异常监控、性能监控、埋点日志和业务日志。
其中,缓存机制模块包括缓存清理模块,缓存清理模块包括自动清理模块和手动清理模块;自动清理模块用于设置缓存空间大小,保留最后被引用文件的清理策略进行缓存空间清理;手动清理模块用于提供手动清理功能,直接清空整个缓存目录。
与现有技术相比,本发明具有如下优点:
(1)本发明对客户端程序开发进行通盘考虑,提供了一个极具扩展性的客户端mvc编程架构。开发者可以基于本方案提供的ioc容器方案,对框架中的所有模块进行自定义配置和扩展,从而大大提高了框架的灵活性。因此该框架可以作为大型app项目的整体开发框架,无论是针对hybrid模式的开发还是纯原生的开发,都可以利用该框架定义的分层结构,以pojo的形式提供业务逻辑,实现代码逻辑的解耦和有效复用,大大提升项目代码的可维护性。
(2)本发明在mvc架构和ioc容器的基础上,内置了hybrid支持的模块,开发者可在页面上直接使用内置的hybrid服务接口进行业务开发,也可以开发自己的服务插件扩展原有服务接口。同时,开发者还可对hybrid模块各个层面(包括jsbridge、view、通讯协议、请求协议等)进行定义实现,定制自己的混合模式框架逻辑。框架内置的上下文模块和请求分发器,使得原生模块与hybrid模块之间进行数据传输和功能调度的便利性大大增加。
(3)本发明提供丰富的功能框架,包括数据监控、日志、缓存、页面包同步、异常捕获等功能的框架,可由开发者自行引入第三方实现,从而实现对现有第三方框架的有效整合。
(4)本发明不是选择扩展原生的控制层,而是作为控制层的一个依赖,对视图对象进行代理,同时,提供一个自带的服务层,实现对原生控制层逻辑的分担。开发者既可以对自己的原生视图控制层进行有效的开发,又能避免造成一个大而无当的视图控制层(massiveviewcontroller)。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为本发明jssdk框架的内部架构框图。
图2为本发明客户端框架的内部架构框图。
图3为本发明服务端框架的内部架构框图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
为了有助于和澄清随后的实施例的描述,在对本发明的具体实施方式进行详细说明之前,对部分术语进行解释,下列的解释应用于本说明书以及权利要求书。
本发明中出现的ioc全称是inversionofcontrol,可译为反转控制,其在软件开发技术中是一种通过容器管理对象约束关系。mvc全名是modelviewcontroller,是模型(model)-视图(view)-控制器(controller)的缩写,其是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,其被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻辑的图形化用户界面的结构中。hybridapp的中文意思是混合模式移动应用,是指介于web-app、native-app这两者之间的app,兼具“nativeapp良好用户交互体验的优势”和“webapp跨平台开发的优势”。js是网页使用高级语言的格式文件。sdk的中文全称是softwaredevelopmentkit,其中文意思是软件开发工具包,一般是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。jssdk是基于javascript技术的,协助web页面的js业务代码与框架核心进行交互的模块。jsbridge是一个java和javascript之间的一座桥梁,其提供了安全、方便的方式从js调用java代码和调用js代码从java。其它英文词语均为代码,不代表其它任何意义。
参照图1至图3,本发明公开一种混合模式智能手机应用开发框架,其是基于ioc容器和mvc架构的hybridapp开发框架,其包括jssdk框架、客户端框架和服务端框架;jssdk框架包括控制层、接口层和调度层,控制层包括内置组件模块和内置控件模块,接口层包括友好接口和js订阅接口,调度层包括js接口调度器和webviewjsbridge对象模块;js接口调度器用于对webviewjsbridge对象模块进行封装,对接口调用方式进行抽象并提供泛化的调用方式;js订阅接口用于对原生平台底层的对象进行订阅和通知;友好接口用于通过js接口调度器与底层交互;内置组件模块和内置控件模块用于在页面中引用显示元素;客户端框架用于给离线包页面模式hybridapp的web页面提供运行环境,其包括离线页面包同步机制模块、框架内核、原生功能支持模块、监控机制模块、缓存机制模块和容错机制模块;框架内核包括webview容器、jsbridge代理模块、控制器接入器、运行时对象池模块、控制器代理模块、框架内置控制器、插件代理模块、框架内置插件、运营数据代理模块、图片缓存代理模块、框架内置数据库插件和框架内置网络协议插件;webview容器用于提供web页面运行的基础环境,其与js粘合机制模块对接;jsbridge代理模块用于封装jsbridge框架,并提供程序接口供下层的模块接入;控制器接入器用于自动获取控制器实例,并将页面传递过来的请求按规则转发到相应的控制器对象中;运行时对象池模块用于保存框架和业务运行中共享的内存对象,并处理该内存对象的订阅和操作;运营数据代理模块用于实现接入全局异常捕获、监控数据和日志;图片缓存代理模块用于实现webview中的图片缓存机制;服务端框架包括服务端控制层、服务层和数据接入层;服务端控制层用于页面上的操作与底层的连接和交互;服务层以插件形式接入内核,为服务端控制层提供支持;数据接入层以插件形式接入内核,提供网络请求和sqlite数据操作。网络请求的内容包括:提供基本的网络请求框架,开发者可定义请求数据对象、响应数据对象、网络正常返回处理、网络出错处理等。sqlite数据操作的内容包括:提供基本的数据操作方法,包括读取、保存、单表查找等,开发者可根据需要定义单表数据实体及复杂的数据库操作。
其中,jssdk框架进一步设有原生注入模块、在线引入模块和模拟对象模块;友好接口、js订阅接口均通过原生注入模块注入至接口层;js接口调度器、webviewjsbridge对象模块均通过原生注入模块注入至调度层;内置组件模块、内置控件模块均通过在线引入模块引入至控制层;模拟对象模块用于实现同一套页面代码同时部署在服务器上和作为离线包页面部署。
其中,jssdk框架进一步包括jssdk支持模块,其通过扩展框架内核提供的抽象控制器和插件,提供支持api实际业务;jssdk支持模块包括页面跳转处理模块、网络请求处理模块、数据库操作模块、系统api调用模块和运营数据收集上报模块。
本发明jssdk框架的功能为:实现web页面的js代码与app框架提供的支持接口的对接;本发明客户端框架可支持安卓系统和ios系统,其功能在于:实现一个可扩展的程序架构,实现页面包同步逻辑,且还可对jssdk框架上的接口实现原生代码支持;本发明服务端框架的功能在于:实现同步接口和监控信息上传接口,并实现页面发布管理后台。
本发明jssdk框架是基于javascript技术的,协助web页面的js业务代码与框架核心进行交互的模块;jssdk框架将定义一组程序接口,以实现通过js接口获取原生功能的目的;jssdk框架还将提供如下功能:页面跳转(包含跳原生和跳页面)、页面异步网络请求、操作原生标题栏、调用操作系统api接口、订阅或操作底层暴露的对象、写日志和提供标准的页面控件和组件。jssdk接口的设置严格遵循平台无关原则,即系统提供的js接口无论在安卓还是在ios平台下都一样可用,且使用方法完全一样,开发者在编写js页面时,不需要考虑平台适配的问题,只要系统提供了接口,则认为该接口在安卓和ios平台下具有一致的使用效果。
webviewjsbridge对象模块通过jssdk框架整合webviewjsbridge,实现js与原生互操作的底层。js接口调度器通过对webviewjsbridge对象进行封装,对上层的接口调用方式进行抽象并提供泛化的调用方式。js订阅接口负责封装页面对原生平台底层的对象的订阅和通知的功能。
本发明为了方便开发者而提供的一系列友好接口,这些接口既有普通的js接口,也有jquery风格的接口,通过接口调度器与底层交互。本发明内置控件和内置组件可直接在页面内引用。为了弥补在线引入的模块缺失导致页面无法直接在浏览器上运行的问题,本发明为无法在线引入的模块提供一个mock对象,实现同一套页面代码,可以同时部署在服务器上和作为离线包页面部署。通过在jssdk中的接口调度方法中增加运行环境的判断,然后对不同的运行环境调用不同的处理逻辑,抹平webview与浏览器的差异。
js接口调度器的主要作用有:处理jsbridge的初始化细节;提供泛化的底层方法调用接口的统一入口,并将请求和参数传递给jsbridge;接口实现的形式为:call(object,method,param[],onsuccess,onerror);object:调用控制器对象名;method:调用的方法名;param[]:所传递的方法参数,是一个map结构;onsuccess:成功返回的回调函数;onerror:异常返回的回调函数;提供一个订阅通知回调方法的注册接口,并调用底层的订阅接口实现页面对底层对象的订阅。向jsbridge注册底层订阅的统一回调入口,并分发给页面回调方法;提供页面初始化接口,在页面初始化完成后,调起页面的初始化方法。
本发明支持如下几种api:页面跳转支持api、网络请求api、标题栏支持api、业务功能支持api、系统api和运营数据采集api。
本发明控制器代理是框架核心提供出来的一个抽象控制器,可被扩展为具有实际功能的控制器,扩展了抽象控制器类的控制器可被控制器接入层自动发现并实例化。本发明插件是可被控制器使用的组件,具有一定的规范,控制器在使用插件时,框架会自动根据定义在控制器实例中的插件接口来搜索符合条件的插件对象注入到控制器对象中。本发明被内核直接使用的抽象插件(对基本抽象插件的扩展),负责接入全局异常捕获、监控数据、日志等功能的实现。本发明被内核直接使用的抽象插件(对基本抽象插件的扩展),负责实现webview中的图片缓存机制。本发明页面包同步机制模块负责将发布在服务器上的页面包同步到本地并更新的机制。本发明框架内置控制器、普通插件、数据库和网络插件是基于框架核心的代理类提供的实现模块,其为框架提供的jsapi提供具体的功能支持。本发明框架内置jsbridge实现模块是框架自带的对jsbridge代理的一个默认实现类,其可被开发者自行提供的jsbridge实现替代。
本发明页面离线包同步模块是离线包页面模式hybridapp改造的基础,这个机制将使客户端能够自动感知后台发布的新页面并根据加载规则自动加载。实现用户app动态发布的功能。每个页面包都是能够单独部署,与本模块的其他版本或其他模块的也面包不存在任何依赖关系;页面同步机制模块并不能保证页面包必然被下载到客户端,页面包下载完成后,客户端必须对页面包进行md5文件校验和文件长度校验,以确保文件下载成功;客户端下载页面包后,如果本地存在版本更高的可用页面包,则放弃该页面包。
其中,js粘合机制模块包括通信协议栈模块,通信协议栈模块用于给上层的业务相关的协议提供支持。通信协议栈模块包括上行协议栈模块和下行协议栈模块,上行协议栈模块通过原生代码主动发起对js代码的调用,上行协议栈以订阅模式进行触发,订阅对象存在运行时对象池中,支持框架提供的事件和业务(原生代码)自定义的事件;下行协议栈模块通过js代码主动发起对原生代码的调用,下行协议栈主要以方法调用作为发起方式,下行协议应同时支持同步和异步的通讯方式。
本发明协议栈是粘合机制的基础设施,基于webviewjsbridge,由app原生代码实现,为上层的业务相关的协议提供支持。协议栈是指页面上的js代码与原生代码发生信息交互之后(通常是通过方法调用和事件),程序对调用事件和交互发生时传递的参数进行分发、解析、处理,以及将处理结果封装、返回的所有方法和机制的集合。基础协议位于协议栈的栈顶,在调用发生时,基础协议的处理方法最先被启动,然后,协议栈中的其他协议才依据在栈中的位置依次启动;位于上层的协议有能力拦截该调用而不让下方的协议继续执行;开发者可以根据需要自由定义协议栈,并可在调用时指定该调用所使用的协议栈。
无论是web页面还是原生页面,在系统运行时,可能会需要互相传递复杂对象,或者需要获取系统核心对象。为了满足这个需求,框架提供了一个web页面和原生代码都可以通过访问共享空间,在这个空间中,业务代码(js或原生)可根据自身需要添加对象数据,由其他需要的代码从中提取数据,业务代码也可以从中提取系统核心的运行时对象,这些对象有不同的生存期,只要在生存期内,即可对对象进行读写操作。
运行时对象是系统在运行状态下,在框架之内可被所有模块访问的数据对象。运行时对象以键值对的形式存在于系统中,具有一定的生命周期。每一个对象的生命周期分为三个阶段:创建、修改、销毁。可通过框架提供的api针对对象进行订阅,对象生命周期的各个阶段都会向订阅者发送信息。每个对象都具有一定的生存期,分为线程级别、进程级别和永久级别。线程级别生存期的对象是生命最短暂的对象,只在创建对象的线程内有效,在线程结束时就会被销毁,主要用于在同一个线程内不同模块之间传递信息,不会长时间占据内存。进程级别的对象在整个应用被退出之前都一直有效,但会随着应用的关闭而销毁。生存期为永久的对象,在被手动删除之前,会一直存在,框架会保证对象在应用被删除前或对象被手动删除前一直有效。
本发明对象按队列的形式组织,每个队列都有一个队列名称,可以通过订阅接口订阅某个队列上的所有对象的事件。队列分为两个级别,核心级别和普通级别。核心级别队列与普通级别的队列的唯一不同在于,核心级别的队列会先于普通级别队列被执行。框架提供一个默认队列,所有业务代码创建的对象都会加入到制定的队列上。也可以在业务代码中将一个对象增加到指定的队列上。这两种方式所创建或使用到的队列都是普通级别的队列。业务代码可以修改普通队列的优先级别,但只会影响到队列在普通队列里的优先顺序。系统有一些保留队列,用于提供系统核心对象。这些队列拥有较高的处理级别,框架会优先调遣这些队列上的订阅方法。
本发明所有的日志在记录时都有类别信息,分为info/warn/error/debug。所有埋点日志都属于info类别。业务日志记录时,可根据需要设置日志类别,框架核心内会根据需要记录其他跟框架运行相关的日志,并设置不同的类别。框架会根据配置文件,选择性地记录和上传某些类别的日志。可以通过配置文件,配置要记录四种类别中的某一种或某几种,同时也可以配置要上传那些类别的日志。框架提供js接口用于记录日志,在记录日志时,除了保存开发者定义的日志级别、日志内容,系统还会自动记录调用者(页面)、调用时间等信息。业务日志会根据监控数据一起上传到服务器。
客户端程序可根据配置文件的设置,对一些点位进行自动的日志记录。主要埋点项:页面发起网络接口调用时和收到响应时,记录请求内容和响应内容;页面跳转时,记录跳转目标地址和参数;页面包同步记录时,记录页面包的版本信息;本地服务方法调用时,记录每一层的方法名和返回结果;系统api调用时,记录调用参数和返回的结果;订阅的对象通知时,记录通知的对象和订阅者。
本发明自动监控app中发生的所有异常,可通过配置文件管理的监控项包括web页面异常和原生代码异常。本发明自动获取每一个交易中,原生代码中每一个步骤的处理时间(本地处理时间、网络处理时间、界面响应时间),配置项包括网络请求、页面跳转和页面包同步。日志根据配置文件,周期性、选择性上传记录中的日志,同时会根据记录时间,删掉过于久远的日志,上传的日志类型、上传周期、删除旧日志的规则都是可以通过配置文件进行配置的。
为了控制产品页面包的大小,页面包中只能包含资源类图片。对于数据类图片,可以直接按照页面开发习惯使用服务器或远程图片。框架提供图片缓存机制(客户端业务和webview业务公用该机制),以优化用户体验。客户端建立图片缓存目录,通过现成缓存框架处理图片缓存(安卓端建议volleyimage,ios建议yykit/sdwebimage),通过webview缓存拦截机制,获取本地缓存的图片。
其中,运行时对象池模块用于保存和管理所有框架内共享的内存对象,执行对象的实际操作、维护对象的生命周期并对订阅进行管理;运行时对象池模块包括线程区模块、进程区模块和永久性模块。
本发明对象池用于保存和管理所有框架内共享的内存对象,执行对对象的实际操作、维护对象的生命周期、对订阅进行管理。对象池分为三个区:线程区、进程区和永久区,分别对应三种生存期限的对象,每个对象队列在每个区内都有一个相应的队列。对象的使用可以通过订阅被动使用,也可以通过引用来主动使用,其使用包括如下步骤:(1)订阅:框架提供接口,使业务可以对对象的创建、修改和销毁的事件进行订阅。可以根据对象的队列名称和id两个维度对对象进行订阅。可以订阅一个指定名称的队列下所有对象、或id为某个字符串的对象、或某个队列下某个id的对象。当符合订阅条件的对象被创建、修改或销毁时,会自动通知订阅者,并将对象的引用和通知的其他内容作为回调参数传递给订阅者。(2)引用:可以通过接口获取对象的复制品(注意不是直接获得对象),并可通过接口将对复制品的修改保存到对象上,从而实现对象的线程保护(线程级的对象也采用这种方式,即使不存在线程竞争);(3)对象操作;(4)销毁:将对象从内存池销毁(会触发销毁的通知);(5)创建:创建对象到内存池(会触发创建通知);(6)保存:提交对对象的修改(会出发修改通知);(7)订阅;(8)解除订阅。
其中,控制器接入器的应用初始化流程为:(1)搜索所有插件和控制器;(2)实例化控制器和插件;(3)生成被包含插件的代理对象;(4)将实例放入对象池。控制器接入器的控制逻辑调度流程为:(1)根据请求搜索对象;(2)如果对象中包含代理,为代理搜索对象;(3)调用对象中的方法;(4)释放对象。
离线包页面模式hybridapp中,页面跳转行为需要被原生代码感知和处理,以实现自有url规范的需求,因此页面跳转不再直接通过一般的location参数实现;如果页面的容器是普通浏览器而非hybridapp的web容器时,又需要按浏览器的处理方式进行页面跳转。为了满足一次开发,到处运行(此处特指兼容hybridapp和浏览器这两种容器)的需求,框架提供专门用于支持页面跳转js方法,并且会判断页面容器,如果确定是hybridapp的容器,则通过框架的底层原生代码支持页面跳转,否则按原来一般的跳转方法进行跳转。
本发明框架提供三种页面跳转方式:直接跳转、替换、跳转并等待结果。直接跳转,是指直接将跳转目标页面覆盖现有页面,用户点击返回按钮之后可以回到原来的页面。替换是指将跳转页面替换现有页面,用户点击返回,等同于在原来页面上点击返回。跳转并等待结果是页面上提供回掉方法接受跳转目标页面返回的信息。原生代码处理页面跳转时,url跳转目标分为三种:原生页面、远程页面、本地页面。
与页面跳转请求类似,页面上发起的异步网络请求(由于要求离线包页面为纯静态页面+异步网络请求,因此所有页面上用到的请求都是异步网络请求)也需要被原生代码感知和处理。同时,框架提供的js处理代码可以判断当前页面的运行环境,如果是天高hybridapp下运行,使用原生代码对网络请求进行处理,否则直接调用页面的ajax请求。
客户端的登陆模块为纯原生代码。后台使用sessionid作为客户端或web用户的登陆凭证。客户端登陆成功后,缓存sessionid到缓冲区。在处理webview触发的网络请求时自动加载该sessionid到请求头中。页面可根据业务需求,通过设置请求接口的参数选择是否将缓存的sessionid加入到请求中。如果需要,则框架会对sessionid缓存进行检查,如果存在,则取出该值,并将该值放在请求头部发送给服务端,如果不存在则调出登陆页。如果不需要加载sessionid,则框架在发出http请求时不会检查,也不会加载sessionid。根据后台接口的加解密方案,客户端保存一个aes密钥并通过该密钥与后台进行密文通信。
为了增加web页面的体验,需要在页面上增加一个原生标题栏,并且可被页面随需变更设置。可以在页面加载完成之后实时修改。标题栏包含标题文本、左按钮、右按钮和一个单级菜单。页面开发者可以根据业务需要对这些元素进行设置。框架提供接口,使开发这可以修改标题栏属性,下文将详细介绍每个内容的设置需求。同时还提供接口,使js可以控制标题栏的动作。
其中,监控机制模块在框架运行的过程中,自动对运行的状况进行实时监控,并将监控数据上传到服务器;监控机制模块的监控数据采集包括:异常监控、性能监控、埋点日志和业务日志。客户端在收集到监控数据之后,会将监控数据缓存在客户端,在用户手机连接到wifi的情况下,将缓存数据上传到服务器。为了避免过度收集和上传数据导致消耗用户空间和流量,因此客户端可以通过配置文件对需要收集的数据类型进行配置,配置文件随着应用一起发布。由于采用先缓存再上传的模式,监控数据可能在被上传之前就已经被用户手动清除。无法保证及时上传以及全部上传。
其中,缓存机制模块包括缓存清理模块,缓存清理模块包括自动清理模块和手动清理模块;自动清理模块用于设置缓存空间大小,保留最后被引用文件的清理策略进行缓存空间清理;手动清理模块用于提供手动清理功能,直接清空整个缓存目录。自动清理:设置缓存空间大小,保留最后被引用文件的清理策略进行缓存空间清理。手动清理:提供手动清理功能,可以直接清空整个缓存目录。
本发明客户端通过调用更新接口,获取最适合当前应用使用的页面包的版本信息和包的下载位置,如果发现该包比本地缓存的包版本号更大,则链接到下载地址进行下载。客户端会不断通过检查更新接口(检查时机包括首页被打开、应用启动、用户进入模块),获取模块更新列表。根据模块更新列表和自身配置和模块可用性的具体情况进行相应的更新行为。
客户端检查更新逻辑为:(1)检查更新:任何app页面被加载,并且距离上一次检查超过24小时;(2)下载新页面包:检查更新完成时,满足网络条件,立即下载;检查更新完成时,不满足网络条件,等待网络条件满足再下载;用户进入一个产品前,该产品必须更新,但未下载更新包时(用户确认框,下载过程弹出loading框),应用重新启动或从后台打开时,如果基础页面包有更新但未下载时(强行弹出loading框);(3)更新:进入一个产品前,如果该产品有更新包可以使用;应用重启或从后台打开时,如果有基础页面包的更新包可以使用的;(4)页面包清理:为了使应用程序在使用过程中不会无限消耗用户设备存储空间,在应用启动时,会对缓存中所存储的页面包进行清理;清理逻辑如下:扫描本地缓存页面包目录,并与数据库中的页面包信息记录进行对比,删除数据库中没有记录的页面包;根据页面包信息记录,与客户端版本号进行对比,删除与客户端版本号不兼容的页面包目录和数据记录;(5)客户端更新容错处理:在页面更新过程中有可能涉及到如下错误:1、网络错误,导致检查或下载出错;2、本地错误,内存不足导致下载或解压出错;3、本地文件包被误删;处理上述错误的方法如下:1、检查、下载、更新三个步骤分离解耦;2、针对检查更新时的网络问题,设置3次重试,如果重试都失败,放弃该次检查,等待下一次检查触发;3、通过md5和文件长度校验文件下载有效性;4、通过产品状态设置,产品更新时,将产品状态设置成不可用,保护更新过程顺利完成。根据不同的本地错误提示用户进行相应的修复措施;5、页面包使用时会进行检查,检查时以产品状态+文件目录共同作为判断依据。
本发明项目后台服务包含负载均衡服务器、hybrid服务(检查更新接口与管理后台合设而成)以及mysql数据库。通过在现有后台的渠道gateway项目及管理后台项目增加服务代理模块将服务引用到后台相关项目的服务中。其中接口服务以http接口调用的形式对外提供服务,具备完整的mvc架构。而gateway上的接口代理模块只需实现控制层逻辑,完成对请求的转发即可。页面发布后台服务以jsp页面对外提供服务,拥有现有管理后台打通的第三方登陆功能,可识别管理后台的登陆用户和用户权限并提供相应服务。管理后台代理模块提供管理后台的登陆信息和权限信息,并提供管理页面框架,将实际服务页面内容以iframe的形式嵌入到页面框架中。
本发明离线包页面发布后台提供完备的页面包发布流程,使业务开发者和app管理员可以通过发布后台进行有效的发布管理,保证发布工作有序进行。发布管理服务内部通过与用户权限服务对接,获取管理员用户的权限信息,并进行相应的权限处理。
通过页面发布后台进行离线页面包的发布管理时,发布后台分为两个阶段进行实施,第一阶段先实现页面包层面的发布和管理;第二阶段实现页面层面的发布管理。页面包管理功能应包含如下功能:模块的管理功能(增删改查、上下架);版本的管理功能(增删该查、上下架)。
本发明还可通过引入现有app开发中的mvc或mvp框架,并在上面整合cordova这一类面向hybrid模式的框架,通过扩展这些框架的插件,实现一些web页面与原生模块的交互能力,并可以实现本方案所实现的框架的一些主要功能,如控制层的分离、hybrid模式的实现、hybrid模块与原生实现模块之间的通讯等。
本发明通过提供一个基础的ioc容器和mvc架构;在这个mvc模式框架之上,提供了hybrid模式的支持;利用ioc容器和mvc模式,实现了对js接口的自定义;hybrid模式和原生模式,共同存在于mvc架构及其他基础设施之上,互相之前通过共享对象池和交互协议进行通讯;针对核心功能,包括jsbridge、view、配置信息、js与原生通讯协议、请求拦截、视图处理等核心模块,开发者也可以提供自定义实现;提供了一系列的外围的功能支持框架,包括日志、页面包、网络请求、网络缓存、数据库、监控、异常捕获等,并且这些功能可以由开发者提供自定义实现。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。