探究Hybrid-APP技術(shù)原理

探究Hybrid-APP技術(shù)原理
author: @TiffanysBear

背景

隨著Web技術(shù)的發(fā)展和移動互聯(lián)網(wǎng)的發(fā)展骚灸,Hybrid技術(shù)已經(jīng)成為一種前端開發(fā)的主流技術(shù)方案慌植。那什么是Hybrid App呢义郑?

Hybrid App(混合模式移動應(yīng)用)是指介于web-app、native-app這兩者之間的app非驮,兼具" Native App良好用戶交互體驗的優(yōu)勢 "和" Web App跨平臺開發(fā)的優(yōu)勢 "。

總的來說芙扎,就是既具有APP的體驗和性能,又具有Web靈活的開發(fā)模式和跨平臺開發(fā)能力戒洼。

現(xiàn)有的技術(shù)方案

1允华、H5 + JSBridge,通過JSBridge完成H5和Native的通信靴寂,賦予H5一定的端能力。是一種基于WebView UI的解決方案褐隆。

2剖踊、React-Native庶弃,進一步通過JSbridge將js解析為虛擬DOM傳遞到Native,并使用原生進行渲染祥山。

3掉伏、小程序解決方案,采用雙線程的渲染機制斧散,將渲染層WebView和邏輯層JavaScriptCore形成獨立的模塊,通過Native進行通信(setData)鸡捐,邏輯層的網(wǎng)絡(luò)請求也會由Native進行轉(zhuǎn)發(fā)。在UI方面源祈,采用的是WebView和原生相結(jié)合的方式色迂。

技術(shù)原理

本文將從jsbridge的原理、實現(xiàn)歇僧、雙向通信、接入方式和H5的嵌入方式進行詳細闡述诈悍。

jsbridge的原理

客戶端能對WebView中請求進行攔截,都有相應(yīng)的API:

Android:

// Android: shouldoverrideurlloading 
public boolean shouldOverrideUrlLoading(WebView view, String url){
    //讀取到url后自行進行分析處理
    
    //如果返回false适袜,則WebView處理鏈接url慕趴,如果返回true,代表WebView根據(jù)程序來執(zhí)行url
    return true;
}

IOS:

// IOS: shouldStartLoadWithRequest 
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSURL *url = [request URL];
     
    NSString *requestString = [[request URL] absoluteString];
    //獲取url scheme后自行進行處理
            

因此冕房,在頁面中可以通過iframe加載src的方式觸發(fā)相應(yīng)的捕獲函數(shù),在捕獲函數(shù)中可以對url中的參數(shù)進行解析给僵;此外,Android還可以通過重寫OnJSPrompt方法帝际,對調(diào)用Prompt進行攔截,同樣能實現(xiàn)通信的目的斑粱。

示例:
調(diào)起ios端:

function iosInvoke(scheme) {
    var elem = document.createElement('iframe');
    var body = document.body || document.getElementsByTagName('body')[0];
    elem.style.display = 'none';
    elem.src = scheme;
    body.appendChild(elem);
    setTimeout(function () {
        body.removeChild(elem);
        elem = null;
    }, 0);
}

調(diào)起android端:

function androidInvoke(scheme) {
    var androidJsBridge = window.Bdbox_android_jsbridge;
    if (androidJsBridge && androidJsBridge.dispatch) {
        androidJsBridge.dispatch(scheme);
    } else {
        var re = window.prompt('BdboxApp:' + JSON.stringify({
            obj: 'Bdbox_android_jsbridge',
            func: 'dispatch',
            args: [scheme]
        }));
        return re;
    }
}

協(xié)議制定URL Scheme

URL Scheme是什么

由于蘋果的app都是在沙盒中脯爪,相互是不能訪問數(shù)據(jù)的。但是蘋果還是給出了一個可以在app之間跳轉(zhuǎn)的方法:URL Scheme痕慢。簡單的說,URL Scheme就是一個可以讓app相互之間可以跳轉(zhuǎn)的協(xié)議快骗。每個app的URL Scheme都是不一樣的塔次,如果存在一樣的URL Scheme方篮,那么系統(tǒng)就會響應(yīng)先安裝那個app的URL Scheme俺叭,因為后安裝的app的URL Scheme被覆蓋掉了泰偿,是不能被調(diào)用的。

設(shè)置URL Scheme

xxxapp://communication?args=xx

如何進行雙向通信

雙向通信主要是H5和Native的雙向通信過程以及參數(shù)傳遞裕照、回調(diào)執(zhí)行调塌。

H5通知Native:

H5通知Native的方式主要有:

  • 調(diào)用prompt/console/alert晋南,調(diào)用時進行參數(shù)傳遞羔砾,端進行攔截重寫
  • URL Scheme跳轉(zhuǎn)攔截,將參數(shù)放在請求URL上政溃,詳細的文章介紹 URL Scheme
  • API掛載态秧,通過Navtive獲取js執(zhí)行環(huán)境,將相應(yīng)的api掛載在js上,供h5調(diào)用

Native通知H5:

  • 回調(diào)機制愤诱,在向Native傳遞信息時,將回調(diào)函數(shù)也傳遞溃槐,Native在調(diào)用完成后科吭,使用js執(zhí)行環(huán)境執(zhí)行回調(diào)函數(shù)

接入方式

  • jsbridge的接入,端方面的jsbridge和h5方面的jsbridge

嵌入方式

h5的嵌入方式:

  • 直接代碼砌溺,直接將H5代碼css、html规伐、js放入端目錄下,以file協(xié)議的方式訪問鲜棠,優(yōu)點是訪問快速培慌,缺點是迭代不方便。
  • 線上地址吵护,以http協(xié)議訪問,使用webview打開url形式馅而,相較于代碼嵌入的方式來說,速度比較慢雄坪,依賴網(wǎng)絡(luò)傳輸速度屯蹦;優(yōu)點是迭代快速
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市登澜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谒亦,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件份招,死亡現(xiàn)場離奇詭異,居然都是意外死亡廓旬,警方通過查閱死者的電腦和手機谐腰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來十气,“玉大人,你說我怎么就攤上這事叶眉∏奂希” “怎么了衅疙?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵饱溢,是天一觀的道長走芋。 經(jīng)常有香客問我绩郎,道長绿聘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮挪圾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘哲思。我一直安慰自己吩案,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著丧肴,像睡著了一般胧后。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上壳快,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音瘤旨,去河邊找鬼竖伯。 笑死裆站,一個胖子當著我的面吹牛黔夭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播本姥,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼婚惫,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了先舷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤牲芋,失蹤者是張志新(化名)和其女友劉穎捺球,沒想到半個月后缸浦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡裂逐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年泣栈,在試婚紗的時候發(fā)現(xiàn)自己被綠了弥姻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掺涛。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖螺捐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情定血,我是刑警寧澤诞外,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站峡谊,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏既们。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一号杏、第九天 我趴在偏房一處隱蔽的房頂上張望斯棒。 院中可真熱鬧,春花似錦荣暮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽百揭。三九已至蜓席,卻和暖如春课锌,著一層夾襖步出監(jiān)牢的瞬間祈秕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工请毛, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瞭亮,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓仙蚜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親委粉。 傳聞我的和親對象是個殘疾皇子娶桦,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

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