摘要:安全安全是很重要的,現(xiàn)在有些實(shí)現(xiàn)中使用了,而在之前,存在任意代碼執(zhí)行漏洞,這就會(huì)導(dǎo)致嚴(yán)重的安全問(wèn)題。
什么是JS Bridge
在大多數(shù)APP開(kāi)發(fā)過(guò)程中,都會(huì)通過(guò)H5來(lái)實(shí)現(xiàn)部分功能,而Hybird APP基本90%以上都是H5?,F(xiàn)在很少有純?cè)腁PP。但是,由于H5頁(yè)面是內(nèi)嵌到原生應(yīng)用的WebView組件(一個(gè)瀏覽器內(nèi)核)中,而手機(jī)瀏覽器Javascript引擎是在一個(gè)沙箱環(huán)境中運(yùn)行,因此JavaScript的權(quán)限受到嚴(yán)格限制,比如沒(méi)有本地文件讀寫(xiě)權(quán)限、不能使用GPS、不能修改系統(tǒng)配置等。所以,如果JavaScript要用到這些受限的能力時(shí),就需要委托原生去實(shí)現(xiàn),原生完成后,再將結(jié)果通知JavaScript,因此,JavaScript和原生之間就需要一個(gè)通信的橋梁,而這個(gè)橋梁本質(zhì)上就是原生的瀏覽器組件(我們統(tǒng)一稱(chēng)之為WebView)與Javascript 通信的通道,一般稱(chēng)為 WebView JavaScript Bridge, 為了簡(jiǎn)單,一般簡(jiǎn)稱(chēng)為 JS bridge。需要說(shuō)明的是,原生不僅僅指移動(dòng)端(Android、IOS)上原生代碼開(kāi)發(fā)的部分,它也可以是Windows、MAC上的,所以原生一詞主要是為了區(qū)分H5,而本文只討論移動(dòng)端的Js Bridge 。
移動(dòng)開(kāi)發(fā)的大勢(shì)今年來(lái),動(dòng)態(tài)化是移動(dòng)開(kāi)發(fā)的主流趨勢(shì),所謂動(dòng)態(tài)化是指可以隨時(shí)更新APP的能力,這是為了克服原生應(yīng)用修改后必須重新發(fā)版的天然不足。目前動(dòng)態(tài)化的技術(shù)主要有四種:熱補(bǔ)丁、混合開(kāi)發(fā)框架(React-Native、Weex等)、純粹的Web APP、原生加H5(需要經(jīng)常更新的部分用H5實(shí)現(xiàn))。 其中熱補(bǔ)丁技術(shù)主要用于修復(fù)一些線(xiàn)上bug,不用于主流開(kāi)發(fā),當(dāng)然也有一些基于熱補(bǔ)丁技術(shù)的分包動(dòng)態(tài)化方案,本文暫不討論。而剩余的三種方案,都是通過(guò)Javascript 和原生配合實(shí)現(xiàn)的,而它們都用到了 Js Bridge, 可見(jiàn)使用一個(gè)好的Js Bridge的重要性。而不同的混合開(kāi)發(fā)框架、Web APP中Js Bridge的實(shí)現(xiàn)和通信協(xié)議都不相同,當(dāng)然,如果你使用的事這些開(kāi)發(fā)框架,你只需要了解相應(yīng)框架下的通信協(xié)議就行,這沒(méi)有什么問(wèn)題。 但是,對(duì)于采用原生加H5的APP,就需要自己挑選一個(gè)合適的Js Bridge了,那么對(duì)于開(kāi)發(fā)者來(lái)說(shuō),什么是好的JavaScript Bridge?
什么是好的JS Bridge? 可用性能夠滿(mǎn)足通信需求、功能完善;當(dāng)然,如果都不能用,還是回家洗洗睡吧~。
健壯性所謂健壯就是經(jīng)得住考驗(yàn),bug少、兼容性好、在各種情況下都能穩(wěn)定運(yùn)行。然而,可怕的事,現(xiàn)有的知名開(kāi)源js bridge 質(zhì)量都存在著嚴(yán)重問(wèn)題,下面是我在兩個(gè)知名Android JS Bridge開(kāi)源庫(kù)下提的問(wèn)題:
https://github.com/lzyzsd/JsB...
https://github.com/jesse01/We...
可見(jiàn),要想造一座好橋,還是不容易的。
跨平臺(tái)為了保證同一份Javascript代碼既能同時(shí)在Android和IOS下正常運(yùn)行,那么好的JavaScript Bridge 應(yīng)該要能跨平臺(tái),這樣才能保證在Android和IOS和H5通信協(xié)議一致。然而,目前Github上萬(wàn)star的 marcuswestin/WebViewJavascriptBridge 官方也只提供了IOS版,盡管有一些第三方Android實(shí)現(xiàn),但大都存在各種各樣的問(wèn)題,有的存在嚴(yán)重bug,如 https://github.com/jesse01/We... , 有的和IOS版差別太大,如 https://github.com/fangj/WebV... 。
安全安全是很重要的,現(xiàn)在有些Android實(shí)現(xiàn)中使用了 webview.addJavascriptInterface ,而在Android 4.2.2之前, webview.addJavascriptInterface 存在任意代碼執(zhí)行漏洞,這就會(huì)導(dǎo)致嚴(yán)重的安全問(wèn)題。
使用簡(jiǎn)單一個(gè)好東西應(yīng)該是用起來(lái)簡(jiǎn)單的。
對(duì)于JS Bridge來(lái)說(shuō),使用簡(jiǎn)單應(yīng)該包括三個(gè)端:Android、IOS、 JavaScript, 也就是說(shuō)無(wú)論對(duì)于哪個(gè)端,用起來(lái)要足夠的簡(jiǎn)單,這很重要,這樣可以避免大量的原生開(kāi)發(fā)和前端開(kāi)發(fā)的撕逼。
強(qiáng)大在滿(mǎn)足可用性和使用簡(jiǎn)單的基礎(chǔ)上,功能要盡可能強(qiáng)大?,F(xiàn)在的很多實(shí)現(xiàn),基本上只滿(mǎn)足了可用性,而功能方面都比較弱,比如:
不支持檢測(cè)是否存在某個(gè)API的方法;有時(shí)隨著版本迭代不確定某個(gè)版本下是否存在某個(gè)Native或Javascript方法(在版本迭代過(guò)程中一些是新添加的)。
不支持進(jìn)度回調(diào);現(xiàn)有JS Bridge基本都只支持一次調(diào)用一次返回,但是有些時(shí)候,如js調(diào)用原生下載文件功能的方法時(shí),原生需要在下載過(guò)程中將下載進(jìn)度不停返回給js。
不支持API管理;現(xiàn)有JS Bridge注冊(cè)API時(shí)基本都是每個(gè)API都需要多帶帶注冊(cè),這樣在API多的情況下,不僅使用回非常麻煩,也不利于API分類(lèi)管理。
福音我給大家捅破了現(xiàn)實(shí),也必須為大家重塑希望!聽(tīng)不懂?那簡(jiǎn)單來(lái)說(shuō),就是前面都是鋪墊,下面才是真正目的!
那么到底有沒(méi)有一個(gè)可用、健壯、跨平臺(tái)、安全、使用簡(jiǎn)單、強(qiáng)大的現(xiàn)成的JS Bridge?
哈哈,當(dāng)然是有的, 經(jīng)過(guò)我通宵達(dá)旦、四處瀏覽、嘔心瀝血、廢寢忘食,終于創(chuàng)造了這么一個(gè)健壯、跨平臺(tái)、安全、使用簡(jiǎn)單、強(qiáng)大的JS Bridge,那就是DSBridge,它有如下特點(diǎn):
Android、IOS、Javascript 三端易用,輕量且強(qiáng)大、安全且健壯。
同時(shí)支持同步調(diào)用和異步調(diào)用
支持以類(lèi)的方式集中統(tǒng)一管理API
支持API命名空間
支持調(diào)試模式
支持API存在性檢測(cè)
支持進(jìn)度回調(diào):一次調(diào)用,多次返回
支持Javascript關(guān)閉頁(yè)面事件回調(diào)
支持Javascript 模態(tài)/非模態(tài)對(duì)話(huà)框
支持騰訊X5內(nèi)核
當(dāng)然得給出源碼地址:
DSBridge for IOS:https://github.com/wendux/DSBridge-IOS
DSBridge for Android: https://github.com/wendux/DSBridge-Android
詳情請(qǐng)參考Github文檔,都有中文哦。
最后,如果你喜歡DSBridge, 歡迎star,不能多年辛苦無(wú)人知啊,哈哈。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/92977.html
electron-bridge github鏈接 求star Motivition 如果想一套代碼同時(shí)能跑在web環(huán)境和electron環(huán)境中,就需要在代碼中先判斷環(huán)境,再分別寫(xiě)對(duì)應(yīng)的邏輯。每次寫(xiě)到electron環(huán)境下的邏輯,又要區(qū)分渲染進(jìn)程和主進(jìn)程,因?yàn)橛行┦轮荒茕秩具M(jìn)程做,有些事只能主進(jìn)程做。所以,我希望能將這些抽象出來(lái),某個(gè)方法,只能在electron環(huán)境下被調(diào)用,并且不需要關(guān)心在什么進(jìn)...
摘要:在實(shí)際項(xiàng)目之中,經(jīng)常會(huì)遇到之中嵌入網(wǎng)頁(yè)的情況,就需要網(wǎng)頁(yè)與原生之間交互,比如獲取當(dāng)前用戶(hù)信息等。一種簡(jiǎn)單的方式就是通過(guò)參數(shù)來(lái)搞定,但是這種方式異常死板,所以有了。本文章旨在記錄的實(shí)現(xiàn),如有錯(cuò)誤,還請(qǐng)指正如有需要了解原理,請(qǐng)。 在實(shí)際項(xiàng)目之中,經(jīng)常會(huì)遇到app之中嵌入網(wǎng)頁(yè)的情況(Hybrid),就需要web網(wǎng)頁(yè)與原生app之間交互,比如獲取當(dāng)前用戶(hù)信息等。一種簡(jiǎn)單的方式就是通過(guò)url參數(shù)...
摘要:在實(shí)際項(xiàng)目之中,經(jīng)常會(huì)遇到之中嵌入網(wǎng)頁(yè)的情況,就需要網(wǎng)頁(yè)與原生之間交互,比如獲取當(dāng)前用戶(hù)信息等。一種簡(jiǎn)單的方式就是通過(guò)參數(shù)來(lái)搞定,但是這種方式異常死板,所以有了。本文章旨在記錄的實(shí)現(xiàn),如有錯(cuò)誤,還請(qǐng)指正如有需要了解原理,請(qǐng)。 在實(shí)際項(xiàng)目之中,經(jīng)常會(huì)遇到app之中嵌入網(wǎng)頁(yè)的情況(Hybrid),就需要web網(wǎng)頁(yè)與原生app之間交互,比如獲取當(dāng)前用戶(hù)信息等。一種簡(jiǎn)單的方式就是通過(guò)url參數(shù)...
閱讀 3245·2023-04-25 20:09
閱讀 3372·2021-11-23 09:51
閱讀 2020·2021-11-22 15:25
閱讀 3459·2021-11-18 10:02
閱讀 2835·2021-09-27 13:56
閱讀 1370·2019-08-30 15:44
閱讀 1208·2019-08-30 13:21
閱讀 3382·2019-08-30 11:05