iOS引擎托管地址: https://github.com/AppCanOpenSource/appcan-ios
Android引擎托管地址: https://github.com/AppCanOpenSource/appcan-android
自定義引擎開(kāi)發(fā)資料在 [開(kāi)發(fā)指導(dǎo)].開(kāi)源&原生能力開(kāi)發(fā)專題——《自定義引擎機(jī)制說(shuō)明》部分均有詳細(xì)介紹,在此不作贅述
AppCan引擎開(kāi)源遵循LGPL寬通用公共許可證協(xié)議第三版: 英文版
通過(guò)對(duì)各大手機(jī)操作系統(tǒng)(如iOS、Android)和系統(tǒng)中瀏覽器引擎底層Webview及其API的封裝和擴(kuò)展,將HTML標(biāo)準(zhǔn)中不提供支持的本地功能(比如攝 像頭,短信,電話等)以Javascript API接口的形式開(kāi)放給HTML頁(yè)面調(diào)用,同時(shí)提供一套完整的Callback機(jī)制,實(shí)現(xiàn)HTML頁(yè)面直接與操作系統(tǒng)底層的交互通信,Javascript腳本語(yǔ)言直接與操作系統(tǒng)C/C++/JAVA/Object-C等原生語(yǔ)言之間通信,實(shí)現(xiàn)系統(tǒng)與HTML頁(yè)面的無(wú)縫融合;通過(guò)在UI層次上實(shí)現(xiàn)一套模擬系統(tǒng)級(jí)別的應(yīng)用(Widget)及應(yīng)用管理機(jī)制、窗口(Window)及多窗口管理機(jī)制,達(dá)到基于HTML5開(kāi)發(fā)移動(dòng)應(yīng)用的目的,實(shí)現(xiàn)核心引擎的跨平臺(tái)能力。
應(yīng)用引擎是一個(gè)支持HTML5應(yīng)用運(yùn)行的支撐平臺(tái),通過(guò)引擎在各平臺(tái)上的適配來(lái)達(dá)到HTML5應(yīng)用的跨平臺(tái)執(zhí)行。核心引擎主要由WidgetOne應(yīng)用管理器、Widget 插件擴(kuò)展機(jī)制,以及Native插件擴(kuò)展機(jī)制三大部分組成。
WidgetOne應(yīng)用管理器是整個(gè)Widget的運(yùn)行環(huán)境,功能主要包括Widget管理、Widget內(nèi)部窗口管理、Widget的生命周期管理、消息事件管理、Widget間通信機(jī)制和Widget的運(yùn)行沙箱管理等。
所有的運(yùn)行的Widget都有一個(gè)公共的父窗口WidgetContainer,Widget通過(guò)Widget的包名來(lái)標(biāo)識(shí),Widget之間可以相互調(diào)用,支持Widget間窗口切換和窗口動(dòng)畫(huà),一個(gè)復(fù)雜的HTML5 應(yīng)用可以由多個(gè)Widget來(lái)組成。而每個(gè)Widget有多個(gè)窗口組成,窗口通過(guò)ID/NAME來(lái)標(biāo)識(shí),每個(gè)Widget內(nèi)部的窗口系統(tǒng)都相互獨(dú)立,窗口之間支持相互調(diào)用,參數(shù)傳遞,窗口動(dòng)畫(huà),窗口預(yù)加載機(jī)制,浮動(dòng)窗口機(jī)制等
因此,多窗口機(jī)制在開(kāi)發(fā)過(guò)程中很重要,根據(jù)不同的name來(lái)分辨不同的window(每一個(gè)應(yīng)用中,有且只有一個(gè)name為’root’的窗口,一般把應(yīng)用加載的第一個(gè)窗口默認(rèn)的命名為’root’)。在不關(guān)閉窗口的情況下,它們之間可以通過(guò)uexWindow.open實(shí)現(xiàn)切換,而不用重新加載html頁(yè)面。為了實(shí)現(xiàn)一些更好的用戶體驗(yàn),擴(kuò)展了原生UI效果,比如ActionSheet,彈動(dòng)效果等。它主要引進(jìn)了主窗口和浮動(dòng)窗口,這樣多的目的就是固定top和bottom部分,避免這兩部分隨著滾動(dòng)條滾動(dòng)。
窗口的實(shí)現(xiàn)原理:
4.1.1、將設(shè)備屏幕可操作區(qū)域轉(zhuǎn)換為Window的概念,通過(guò)拆分,將設(shè)備屏幕(Window)分成了Top,Bottom,Main,PopOver(浮動(dòng)窗口)區(qū)域,每個(gè)區(qū)域由獨(dú)立的WebView組成,相互獨(dú)立,又相互通融,實(shí)現(xiàn)Window內(nèi)的UI元素自由定義。
4.1.2、通過(guò)模擬系統(tǒng)UI元素壓棧的方式(如Android平臺(tái)的Activity棧),將創(chuàng)建的Window壓入棧堆,通過(guò)對(duì)Window的命名,位置,大小,透明度,顯隱等屬性的控制,實(shí)現(xiàn)一套應(yīng)用內(nèi)支持創(chuàng)建多個(gè)Window,并對(duì)每個(gè)Window生命周期進(jìn)行單獨(dú)管理的機(jī)制,靈活管理Window的創(chuàng)建,顯示,隱藏,復(fù)用,銷毀,內(nèi)存回收等。
4.1.3、實(shí)現(xiàn)一套浮動(dòng)窗口機(jī)制。即,同一個(gè)Window中理論上可以創(chuàng)建足夠多個(gè)數(shù)的浮動(dòng)窗口,并且根據(jù)創(chuàng)建的先后順序,覆蓋到當(dāng)前Window中來(lái),形成一塊獨(dú)立的區(qū)域,解決了手機(jī)上不支持局部div滾動(dòng),不支持IFrame高度定義等的硬傷,以及配套的上下拉刷新效果,OAuth驗(yàn)證機(jī)制等功能的加入,增強(qiáng)了用戶體驗(yàn)和為開(kāi)發(fā)者降低了開(kāi)發(fā)難度。
4.1.4、實(shí)現(xiàn)一套窗口間和窗口內(nèi)浮動(dòng)窗口間的交互機(jī)制。通過(guò)擴(kuò)展的Javascript對(duì)象uexWindow對(duì)象下的諸多API,實(shí)現(xiàn)窗口間的交互。如uexWindow.evaluateScript(String inWindowName, String inType, StringinScript),可在任何一個(gè)Window中指定要在一個(gè)名為inWindowName的Window中執(zhí)行Javascript函數(shù);而uexWindow.evaluatePopoverScript(String inWndName, String inPopName,String inScript)則可在任何一個(gè)Window中指定要在一個(gè)名為inWndName的窗口下的名為inPopName的浮動(dòng)窗口中執(zhí)行Javascript函數(shù)。
4.1.5、實(shí)現(xiàn)窗口生命周期內(nèi)的過(guò)度動(dòng)畫(huà)效果。如窗口創(chuàng)建并被添加到屏幕上時(shí),指定一個(gè)從左到右的切入效果,窗口被關(guān)閉銷毀時(shí),指定一個(gè)從右到左的切出效果等等?;具_(dá)到了與系統(tǒng)級(jí)別UI界面切換效果的一致。
通過(guò)AppCan平臺(tái)生成的應(yīng)用,可以理解為一個(gè)Widget包(即在IDE創(chuàng)建項(xiàng)目是看到的’phone’文件夾),和一個(gè) AppCan平臺(tái)中間件組成的。通常的情況下,一個(gè)應(yīng)用是由一個(gè)Widget+AppCan構(gòu)成,那么,有沒(méi)有可能說(shuō)’n個(gè)Widget+AppCan’ 的機(jī)制呢,答應(yīng)是肯定的,這就是Widget 插件機(jī)制,是針對(duì)主widget以及普通widget 的一種增強(qiáng)性的擴(kuò)展機(jī)制,可以將具有特定功能的widget封裝成一個(gè)單獨(dú)的widget包存放到plugin 下,然后通過(guò)js擴(kuò)展接口調(diào)用,以達(dá)到功能擴(kuò)展的目的。我們把’1個(gè)Widget+AppCan’中的那一個(gè)Widget叫做’主Widget’,而另外 的’n-1’個(gè)Widget存在于主Widget的’plugin’目錄下。
由于這部分資料在 [開(kāi)發(fā)指導(dǎo)].開(kāi)源&原生能力開(kāi)發(fā)專題——《Widget插件擴(kuò)展機(jī)制》部分均有詳細(xì)介紹,在此不作贅述。
有了Native插件的配合使用,開(kāi)發(fā)者只要寫(xiě)最簡(jiǎn)單的HTML,CSS和JS,就可以開(kāi)發(fā)出一個(gè)體驗(yàn)效果和原生無(wú)差別的應(yīng)用。
5.1、 AppCan開(kāi)放了原生插件擴(kuò)展機(jī)制,靈活的自定義插件擴(kuò)展架構(gòu),方便開(kāi)發(fā)者快速集成自定義功能到應(yīng)用開(kāi)發(fā)中。開(kāi)發(fā)者將自定義原生插件進(jìn)行開(kāi)發(fā)和上傳,即可在開(kāi)發(fā)中直接調(diào)用。
5.2、 對(duì)目前平臺(tái)提供的數(shù)十種應(yīng)用插件進(jìn)行開(kāi)源,開(kāi)發(fā)者可以根據(jù)自身業(yè)務(wù)需求來(lái)對(duì)開(kāi)源插件進(jìn)行擴(kuò)展,或自行開(kāi)發(fā)。
源碼在官網(wǎng)插件庫(kù)均可下載,分為終端設(shè)備系統(tǒng)調(diào)用API、界面API、網(wǎng)絡(luò)API、多媒體API、第三方API等幾個(gè)類別,足夠覆蓋移動(dòng)應(yīng)用開(kāi)發(fā)中的大部分常用場(chǎng)景。其中包含新的支付寶插件和新百度地圖SDK 封裝的百度地圖插件,備受關(guān)注的 QQ 登錄功能插件、微信分享(支付)插件,以及推送、攝 像頭、傳感器、LBS、二維碼、文件讀寫(xiě)、網(wǎng)絡(luò)連接、上傳下載、短信、彩信、電話、郵件、圖片、第三方支付、音頻、視頻、壓縮、原生控件元素等核心功能。
更多建議: