亲爱的广大开发者:
AppCan于12月23日下午15点,全面开源服务平台应用引擎
关于AppCan引擎开源协议
AppCan引擎开源遵循LGPL宽通用公共许 可 证协议第三版:英文版
【应用引擎的技术原理】
通过对各大手机操作系统(如iOS、Android)和系统中浏览器引擎底层Webview及其API的封装和扩展,将HTML标准中不提供支持的本地功能(比如摄 像头,短信,电话等)以Javascript API接口的形式开放给HTML页面调用,同时提供一套完整的Callback机制,实现HTML页面直接与操作系统底层的交互通信,Javascript脚本语言直接与操作系统C/C++/JAVA/Object-C等原生语言之间通信,实现系统与HTML页面的无缝融合;通过在UI层次上实现一套模拟系统级别的应用(Widget)及应用管理机制、窗口(Window)及多窗口管理机制,达到基于HTML5开发移动应用的目的,实现核心引擎的跨平台能力。
【应用引擎的总体架构】
应用引擎是一个支持HTML5应用运行的支撑平台,通过引擎在各平台上的适配来达到HTML5应用的跨平台执行。核心引擎主要由WidgetOne应用管理器、Widget 插件扩展机制,以及Native插件扩展机制三大部分组成。
<ignore_js_op>
一、WidgetOne应用管理器
WidgetOne应用管理器是整个Widget的运行环境,功能主要包括Widget管理、Widget内部窗口管理、Widget的生命周期管理、消息事件管理、Widget间通信机制和Widget的运行沙箱管理等。
所有的运行的Widget都有一个公共的父窗口WidgetContainer,Widget通过Widget的包名来标识,Widget之间可以相互调用,支持Widget间窗口切换和窗口动画,一个复杂的HTML5 应用可以由多个Widget来组成。而每个Widget有多个窗口组成,窗口通过ID/NAME来标识,每个Widget内部的窗口系统都相互独立,窗口之间支持相互调用,参数传递,窗口动画,窗口预加载机制,浮动窗口机制等
因此,多窗口机制在开发过程中很重要,根据不同的name来分辨不同的window(每一个应用中,有且只有一个name为‘root‘的窗口,一般把应用加载的第一个窗口默认的命名为‘root‘)。在不关闭窗口的情况下,它们之间可以通过uexWindow.open实现切换,而不用重新加载html页面。为了实现一些更好的用户体验,扩展了原生UI效果,比如ActionSheet,弹动效果等。它主要引进了主窗口和浮动窗口,这样多的目的就是固定top和bottom部分,避免这两部分随着滚动条滚动。
窗口的实现原理:
(1)将设备屏幕可操作区域转换为Window的概念,通过拆分,将设备屏幕(Window)分成了Top,Bottom,Main,PopOver(浮动窗口)区域,每个区域由独立的WebView组成,相互独立,又相互通融,实现Window内的UI元素自由定义。
(2)通过模拟系统UI元素压栈的方式(如Android平台的Activity栈),将创建的Window压入栈堆,通过对Window的命名,位置,大小,透明度,显隐等属性的控制,实现一套应用内支持创建多个Window,并对每个Window生命周期进行单独管理的机制,灵活管理Window的创建,显示,隐藏,复用,销毁,内存回收等。
(3)实现一套浮动窗口机制。即,同一个Window中理论上可以创建足够多个数的浮动窗口,并且根据创建的先后顺序,覆盖到当前Window中来,形成一块独立的区域,解决了手机上不支持局部div滚动,不支持IFrame高度定义等的硬伤,以及配套的上下拉刷新效果,OAuth验证机制等功能的加入,增强了用户体验和为开发者降低了开发难度。
(4)实现一套窗口间和窗口内浮动窗口间的交互机制。通过扩展的Javascript对象uexWindow对象下的诸多API,实现窗口间的交互。如uexWindow.evaluateScript(String inWindowName, String inType, StringinScript),可在任何一个Window中指定要在一个名为inWindowName的Window中执行Javascript函数;而uexWindow.evaluatePopoverScript(String inWndName, String inPopName,String inScript)则可在任何一个Window中指定要在一个名为inWndName的窗口下的名为inPopName的浮动窗口中执行Javascript函数。
(5)实现窗口生命周期内的过度动画效果。如窗口创建并被添加到屏幕上时,指定一个从左到右的切入效果,窗口被关闭销毁时,指定一个从右到左的切出效果等等。基本达到了与系统级别UI界面切换效果的一致。
二、Widget 插件扩展机制
通过AppCan平台生成的应用,可以理解为一个Widget包(即在IDE创建项目是看到的‘phone‘文件夹),和一个 AppCan平台中间件组成的。通常的情况下,一个应用是由一个Widget+AppCan构成,那么,有没有可能说‘n个Widget+AppCan‘ 的机制呢,答应是肯定的,这就是Widget 插件机制,是针对主widget以及普通widget 的一种增强性的扩展机制,可以将具有特定功能的widget封装成一个单独的widget包存放到plugin 下,然后通过js扩展接口调用,以达到功能扩展的目的。我们把‘1个Widget+AppCan‘中的那一个Widget叫做‘主Widget‘,而另外 的‘n-1‘个Widget存在于主Widget的‘plugin‘目录下。
由于这部分资料在官网文档均有详细介绍,在此不作赘述
三、Native插件扩展机制
有了Native插件的配合使用,开发者只要写最简单的HTML,CSS和JS,就可以开发出一个体验效果和原生无差别的应用。
首先,AppCan开放了原生插件扩展机制,灵活的自定义插件扩展架构,方便开发者快速集成自定义功能到应用开发中。开发者将自定义原生插件进行开发和上传,即可在开发中直接调用。
其次,对目前平台提供的数十种应用插件进行开源,开发者可以根据自身业务需求来对开源插件进行扩展,或自行开发。
源码在官网插件库均可下载,分为终端设备系统调用API、界面API、网络API、多媒体API、第三方API等几个类别,足够覆盖移动应用开发中的大部分常用场景。其中包含新的支付宝插件和新百度地图SDK 封装的百度地图插件,备受关注的 QQ 登录功能插件、微信分享(支付)插件,以及推送、摄 像头、传感器、LBS、二维码、文件读写、网络连接、上传下载、短信、彩信、电话、邮件、图片、第三方支付、音频、视频、压缩、原生控件元素等核心功能。
AppCan全体运营团队
2014年12月23日