如何優(yōu)雅的談?wù)揌ybrid App

重要的并不是我們提供的信息量有多大捌肴,而是我們能否給他們提供真正需要的信息柒室。 -《瞬間之美》

本文涉及如下方面:

  • 什么是Hybrid架構(gòu)(可略讀)
  • Hybrid與Native的關(guān)系
  • 設(shè)計上的考慮
  • 一句話說明白
  • 技術(shù)實現(xiàn)
  • Cordova

Hybrid架構(gòu)

Hybrid App:Hybrid App is a mobile application that is coded in both browser-supported language and computer language. They are available through application distribution platforms such as the Apple App Store, Google Play etc. Usually, they are downloaded from the platform to a target device, such as iPhone, Android phone or Windows Phone. The subscribers need to install to run them.

Hybrid App(混合模式移動應(yīng)用)是指介于web-app、native-app這兩者之間的app,兼具“Native App良好用戶交互體驗的優(yōu)勢”和“Web App跨平臺開發(fā)的優(yōu)勢”。Hybrid開發(fā)效率高、跨平臺商叹、低層本的特點,Hybrid從業(yè)務(wù)開發(fā)上講只泼,沒有版本問題沈自,對于BUG能及時修復(fù)。但Hybrid也是有缺點的辜妓,Hybrid體驗比不上Native枯途,同樣的功能在性能上存在巨大差距。Web界面上JS對HTML Node的操作需要消耗大量的CPU資源籍滴,手機CPU的性能還不能與PC相提并論酪夷,就算在智能手機之間,硬件水準也參差不齊孽惰,一個可以在iPhone 6上流暢運行的界面晚岭,跑到三星上很可能就卡住不動了。所以我們經(jīng)逞Γ可以發(fā)現(xiàn)一些富交互頁面上的操作無法達到令人滿意的流暢度坦报,而流暢度也正是用戶評價一款A(yù)pp優(yōu)劣的最直觀因素库说。所以混合式編程比較適用于需要快速試錯、快速占領(lǐng)市場的團隊片择,當然潜的,也不是絕對。

Hybrid App按網(wǎng)頁語言與程序語言的混合字管,通常分為三種類型:多View混合型啰挪,單View混合型,Web主體型嘲叔。

多View混合型即Native View和Web View獨立展示亡呵,交替出現(xiàn)。這種應(yīng)用混合邏輯相對簡單硫戈。即在需要的時候锰什,將WebView當成一個獨立的View(Activity)運行起來,在WebView內(nèi)完成相關(guān)的展示操作丁逝。這種移動應(yīng)用主體通常是Native App歇由,Web技術(shù)只是起到補充作用。開發(fā)難度和Native App基本相當果港。

單View混合型即在同一個View內(nèi),同時包括Native View和Web View糊昙⌒谅樱互相之間是覆蓋(層疊)的關(guān)系。這種Hybrid App的開發(fā)成本較高释牺,開發(fā)難度較大萝衩,但是體驗較好。如百度搜索為代表的單View混合型移動應(yīng)用没咙,既可以實現(xiàn)充分的靈活性猩谊,又能實現(xiàn)較好的用戶體驗。

Web主體型即移動應(yīng)用的主體是Web View祭刚,主要以網(wǎng)頁語言編寫牌捷,穿插Native功能的Hybrid App開發(fā)類型。這種類型開發(fā)的移動應(yīng)用體驗相對而言存在缺陷涡驮,但整體開發(fā)難度大幅降低暗甥,并且基本可以實現(xiàn)跨平臺。Web主體型的移動應(yīng)用用戶體驗的好壞捉捅,主要取決于底層中間件的交互與跨平臺的能力撤防。國外的appMobi、PhoneGap和國內(nèi)的WeX5棒口、AppCan和Rexsee都屬于Web主體型移動應(yīng)用中間件寄月。其中Rexsee不支持跨平臺開發(fā)辜膝。appMobi和PhoneGap除基礎(chǔ)的底層能力更多是通過插件(Plugins)擴展的機制實現(xiàn)Hybrid。AppCan除了插件機制漾肮,還提供了大量的單View混合型的接口來完善和彌補Web主體型Hybrid App體驗差的問題厂抖,接近Native App的體驗。而WeX5則在揉合PhoneGap和Bootstrap等主流技術(shù)的基礎(chǔ)上初橘,對性能進一步做了深度優(yōu)化验游,不但完全具備Native App對本地資源的調(diào)用能力,性能體驗也不輸原生保檐;WeX5所開發(fā)出來的app具備完全的跨端運行能力耕蝉,可以無需任何修改直接運行在各種前端環(huán)境上。

多主體共存型(靈活型)是一種新型的開發(fā)模式夜只,即支持Web主體型的應(yīng)用垒在,又支持以Native主體的應(yīng)用,也支持兩者混合的開發(fā)模式扔亥。比如kerkee框架 场躯,它具有跨平臺、用戶體驗好旅挤、性能高踢关、擴展性好、靈活性強粘茄、易維護签舞、規(guī)范化、具有Debug環(huán)境柒瓣、徹底解決跨域問題等特點儒搭。用戶體驗與Native App媲美。功能方面芙贫,開發(fā)者可隨意擴展接口搂鲫。

Hybrid與Native的關(guān)系

在Hybrid架構(gòu)設(shè)計中Native提供的是一宿主環(huán)境,實現(xiàn)合理的邏輯架構(gòu)需要考慮:交互設(shè)計磺平,資源訪問魂仍,Hybrid開發(fā)調(diào)試,通訊設(shè)計拣挪、并發(fā)設(shè)計蓄诽、異常處理、日志監(jiān)控以及安全模塊等問題媒吗,前端要做的事情就是封裝Native提供的各種能力仑氛。

處理交互設(shè)計時需要考慮前端與Native配合處理,如H5與Native的互相跳轉(zhuǎn)邏輯;
資源訪問機制需要做到既能以file的方式訪問Native內(nèi)部資源锯岖,又能使用url的方式訪問線上資源介袜,處理好跳轉(zhuǎn)的邏輯;需要提供前端資源增量替換機制出吹,以擺脫APP迭代發(fā)版問題遇伞,避免用戶升級APP,這里將涉及到靜態(tài)資源在APP中的存放策略捶牢,更新策略的設(shè)計鸠珠,以及服務(wù)器端的支持等。當然秋麸,有現(xiàn)成框架和解決方案的支持渐排,但這些確實是不可忽略的問題。

Hybrid的交互是通過Native調(diào)用前端頁面的JS方法灸蟆,或者前端頁面通過JS調(diào)用Native提供的接口實現(xiàn)的驯耻,兩者交互的橋梁是Webview,iOS可以使用javascripbrige來實現(xiàn)(現(xiàn)成框架)炒考,在UIWebView的shouldStartLoadWithRequest方法里面捕獲url的變化可缚,解析出需要的參數(shù),然后傳給一個統(tǒng)一的處理方法斋枢。app自身可以自定義url schema帘靡,并且把自定義的url注冊在調(diào)度中心。JS與Native通信可以創(chuàng)建這類URL被Native捕獲處理瓤帚,即schema跳轉(zhuǎn)邏輯描姚。APP安裝后會在手機上注冊一個schema,比如淘寶是taobao://缘滥,Native會有一個進程監(jiān)控Webview發(fā)出的所有schema://請求,然后分發(fā)到“控制器”谒主。hybridapi處理程序朝扼,Native控制器處理時會需要param提供的參數(shù)(encode過),根據(jù)實際需要處理業(yè)務(wù)邏輯問題霎肯。

設(shè)計上的考慮

無論在Android還是iOS平臺上擎颖,都有各自的一套交互習(xí)慣,包括視覺風格观游,界面切換搂捧,操作習(xí)慣等,與Web習(xí)慣完全不同懂缕。以iOS界面切換為例允跑,系統(tǒng)風格是新界面自右向左推入,后退時界面自左向右推出,而舊界面保持狀態(tài)聋丝。Web開發(fā)的默認習(xí)慣則是刷新頁面索烹,無論新載入頁面或是后退,都會對頁面進行刷新弱睦。因此使用Web模式開發(fā)多界面功能就面臨這樣的交互習(xí)慣差異百姓,造成體驗上的損失。當然Web方式也可模擬Native的交互方式况木,但這樣的模擬首先提高了開發(fā)成本垒拢,有悖于最初的高效原則,從效果上看火惊,也很難達到Native的流暢性求类。

一句話說明白

如果用一句話來講明白這個問題,就是Hybrid混合式編程可以在Native原生應(yīng)用的基礎(chǔ)上通過一些Hybrid框架實現(xiàn)本地和JS的交互處理矗晃。在不影響性能的情況下仑嗅,實現(xiàn)應(yīng)用的動態(tài)化。

技術(shù)實現(xiàn)原理

Hybrid技術(shù)將靜態(tài)資源存于Native张症,目錄結(jié)構(gòu)可以如下面劃分仓技,當然不是絕對的脖捻,基本要求是將對應(yīng)版本的Hybrid插件下載到本地兆衅,存放方便就好羡亩。


在正式的開發(fā)中畏铆,還要考慮增量機制雷袋,因為不同的版本會對應(yīng)著不同的業(yè)務(wù)邏輯,真實的增量機制需要服務(wù)器端的配合辞居,版本映射表是每次大版本APP發(fā)布時由服務(wù)器端生成楷怒。當APP啟動時,APP會讀取版本信息瓦灶,如果發(fā)現(xiàn)本地版本號比線上的小鸠删,便會下載對應(yīng)的zip文件,然后解壓之后并且替換整個原有的文件贼陶,本次增量結(jié)束刃泡,因為所有的版本文件不會重復(fù)巧娱,APP回滾時可用回到任意想去的版本,也可以對任意版本做BUG修復(fù)家卖。

以上,我們得知庙楚,Hybrid和Native交互可以通過兩種方式:Url Schema和JavaScriptCore等地交互馒闷。H5與Native交互的橋梁為Webview酪捡,“聯(lián)系”的方式以url schema的方式纳账,在用戶安裝app后逛薇,app可以自定義url schema,并且把自定義的url注冊在調(diào)度中心疏虫。

demoschema://hybridapi?callback=hybrid_1446276509894&param=%7B%22data1%22%3A1%2C%22data2%22%3A2%7D

App調(diào)用H5:將一組API綁定在webView的window對象上永罚,App通過iOS原生方法調(diào)用window對象中的js方法呢袱。
H5與App通信:App實現(xiàn)對Webview URL的觀察者模式,H5 通過改變URL的哈希值治专,通過解析哈希值的變化執(zhí)行相應(yīng)的操作棒旗。

另一種是JavaScriptCore婿滓,具體的可以看之前寫的文章JavaScriptCore框架橘券。

context[@"makeUIColor"] = ^(NSDictionary *rgbColor){
float red = [rgbColor[@"red"] floatValue];
float green = [rgbColor[@"green"] floatValue];
float blue = [rgbColor[@"blue"] floatValue];
return [UIColor colorWithRed:(red / 255.0)
                   green:(green / 255.0)
                    blue:(blue / 255.0)
                   alpha:1];
};
JSValue *color = [context evaluateScript:@"makeUIColor({red: 50, green: 150, blue: 250})"];
NSLog(@"color:%@",[color toObject]);

通過這種方式就可以在JavaScript中調(diào)用Objective-C毯焕。

當然,除此之外也可以用JSBridge技術(shù)實現(xiàn)磺樱。
JS中:

 button.onclick = function(e) {
    e.preventDefault();
    var data = 'Hello from JS button';
    log('JS sending message', data);
    window.external.test1(data, 'haha');
}

通過JSBridge,執(zhí)行本地類中的test1方法纳猫。此處只是一個引子,詳細的會在另一篇文章中單獨引出竹捉。

至于H5和Native的跳轉(zhuǎn)問題芜辕,可以采用統(tǒng)跳協(xié)議來完成。這又是另外一個問題了块差。當然也可以在JS里定義跳轉(zhuǎn)地址侵续,通過JS交互來處理。

Cordova

寫了那么久憨闰,感覺現(xiàn)在才進入主題状蜗。

Cordova提供了一組設(shè)備相關(guān)的API,通過這組API起趾,移動應(yīng)用能夠以JavaScript訪問原生的設(shè)備功能诗舰,如攝像頭、麥克風等训裆。Cordova還提供了一組統(tǒng)一的JavaScript類庫眶根,以及為這些類庫所用的設(shè)備相關(guān)的原生后臺代碼。

測試使用可以到Github上下載源碼,也可以使用命令:

cordova create hello com.example.hello HelloWorld
cd hello
cordova platform add ios

這樣就創(chuàng)建了hello文件夾下的測試目錄(com.example.hello 為應(yīng)用程序的id名边琉,與Xcode中類似属百,可以在 config.xml 中修改,如果不指定的話默認為 io.cordova.hellocordova)变姨。

目錄文件說明:
config.xml :cordova的配置文件
hooks/ :存放自定義cordova命令的腳本文件族扰。
platforms/ :各個平臺原生工程代碼,會在build時被覆蓋勿修改
plugins/ :插件目錄(主要是提供各個平臺的原生API)
www/ :用H5編寫的源代碼目錄定欧,build時會被放入各個平臺的assets\www目錄渔呵。
www/index.html :App入口html文件

在Xcode編譯運行的話,使用的是 Staging 下面的html頁面砍鸠。

命令安裝需要安裝cordova命令

brew install node //該命令執(zhí)行后扩氢,自動裝好node和npm。
brew upgrade node //更新node(可不執(zhí)行)

為了解決校驗碼不正確問題爷辱。npm 使用國內(nèi)鏡像的方法 (三種辦法任意一種都能解決問題录豺,建議使用第三種朦肘,將配置寫死,下次用的時候配置還在):

1.通過config命令
npm config set registry http://registry.cnpmjs.org npm info underscore (如果上面配置正確這個命令會有字符串response)
2.命令行指定
npm --registry http://registry.cnpmjs.org info underscore 
3.編輯 ~/.npmrc 加入下面內(nèi)容
registry = http://registry.cnpmjs.org

之后:

sudo npm install -g cordova

打開platform/ios里的HelloWorld.xcodeproj即可測試双饥。

下面就是源碼分析了媒抠,因為要對照著源碼來說,大家可以到這里咏花,參考詳細的源碼分析趴生。通過這里,寫一個混合式App應(yīng)該不是問題了昏翰。

最后冲秽,祝大家看的愉快!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末矩父,一起剝皮案震驚了整個濱河市锉桑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌窍株,老刑警劉巖民轴,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異球订,居然都是意外死亡后裸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門冒滩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來微驶,“玉大人,你說我怎么就攤上這事开睡∫蚱唬” “怎么了?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵篇恒,是天一觀的道長扶檐。 經(jīng)常有香客問我,道長胁艰,這世上最難降的妖魔是什么款筑? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮腾么,結(jié)果婚禮上奈梳,老公的妹妹穿的比我還像新娘。我一直安慰自己解虱,他們只是感情好攘须,可當我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饭寺,像睡著了一般阻课。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上艰匙,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天限煞,我揣著相機與錄音,去河邊找鬼员凝。 笑死署驻,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的健霹。 我是一名探鬼主播旺上,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼糖埋!你這毒婦竟也來了宣吱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤瞳别,失蹤者是張志新(化名)和其女友劉穎征候,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體祟敛,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡疤坝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了馆铁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片跑揉。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖埠巨,靈堂內(nèi)的尸體忽然破棺而出历谍,到底是詐尸還是另有隱情,我是刑警寧澤辣垒,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布扮饶,位于F島的核電站,受9級特大地震影響乍构,放射性物質(zhì)發(fā)生泄漏甜无。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一哥遮、第九天 我趴在偏房一處隱蔽的房頂上張望岂丘。 院中可真熱鬧眠饮,春花似錦奥帘、人聲如沸仪召。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秸苗。三九已至,卻和暖如春运褪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背秸讹。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留弧可,地道東北人。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓侣诺,卻偏偏與公主長得像氧秘,于是被迫代替她去往敵國和親年鸳。 傳聞我的和親對象是個殘疾皇子丸相,可洞房花燭夜當晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 目錄 1 概述 2 Cordova 平臺 3 Web 發(fā)展史3.1 靜態(tài)網(wǎng)頁3.2 動態(tài)網(wǎng)頁3.3 客戶端異步交互...
    適合自己的最好閱讀 3,487評論 0 17
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,085評論 25 707
  • 一:混合開發(fā)模式的背景 APP的三種開發(fā)模式:Native App灭忠、 Web App膳算、Hybrid App弛作。 1....
    濼莫繁華閱讀 13,668評論 1 16
  • 徐徐微風, 吹拂著河邊的蘆葦映琳。 搖搖擺擺, 驚醒睡夢中的野鴨萨西。 皎皎明月有鹿, 浮在誰一樣的天上谎脯。 漾漾微波葱跋, 喚醒夢...
    紅璞閱讀 156評論 0 1
  • 今天是我的生日, 并且還有一堆的故事稍味。 如果你愿意帶著心情傾聽, 那么故事里還會有紅酒和美食模庐。 不為知己不是艷遇,...
    琢玉書生閱讀 153評論 0 2