电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Javascript之JSBridge初探

瀏覽:4日期:2023-06-05 14:31:06
JSBridge 的起源

近些年,移動端普及化越來越高,開發過程中選用 Native 還是 H5 一直是熱門話題。Native 和 H5 都有著各自的優缺點,為了滿足業務的需要,公司實際項目的開發過程中往往會融合兩者進行 Hybrid 開發。Native 和 H5 分處兩地,看起來無法聯系,那么如何才能讓雙方協同實現功能呢?

這時我們想到了 Codova ,Codova 提供了一組與設備相關的 API ,是早期js調用原生代碼來實現原生功能的常用方案。不過 JSBridge 真正在國內廣泛應用是由于移動互聯網的盛行。

JSBridge 是一種 JS 實現的 Bridge,連接著橋兩端的 Native 和 H5。它在 APP 內方便地讓 Native 調用 JS,JS 調用 Native ,是雙向通信的通道。JSBridge 主要提供了 JS 調用 Native代碼的能力,實現原生功能如查看本地相冊、打開攝像頭、指紋支付等。

H5 與 Native 對比

name H5 Native 穩定性 調用系統瀏覽器內核,穩定性較差 使用原生內核,更加穩定 靈活性 版本迭代快,上線靈活 迭代慢,需要應用商店審核,上線速度受限制 受網速 影響 較大 較小 流暢度 有時加載慢,給用戶“卡頓”的感覺 加載速度快,更加流暢 用戶體驗 功能受瀏覽器限制,體驗有時較差 原生系統 api 豐富,能實現的功能較多,體驗較好 可移植性 兼容跨平臺跨系統,如 PC 與 移動端,iOS 與 Android 可移植性較低,對于 iOS 和 Android 需要維護兩套代碼 JSBridge 的雙向通信原理JS 調用 Native

JS 調用 Native 的實現方式較多,主要有攔截URL Scheme、重寫 prompt 、注入 API 等方法。

攔截 URL Scheme

Android 和 iOS 都可以通過攔截 URL Scheme 并解析 Scheme 來決定是否進行對應的 Native 代碼邏輯處理。

Android 的話,Webview提供了shouldOverrideUrlLoading方法來提供給 Native 攔截 H5 發送的URL Scheme請求。代碼如下:

public class CustomWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { ...... // 場景一: 攔截請求、接收 schemeif (url.equals('xxx')) { // handle ... // callback view.loadUrl('JavaScript:setAllContent(' + json + ');') return true;}return super.shouldOverrideUrlLoading(url); }}

iOS 的WKWebview可以根據攔截到的URL Scheme和對應的參數執行相關的操作。代碼如下:

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{ if ([navigationAction.request.URL.absoluteString hasPrefix:@'xxx']) {[[UIApplication sharedApplication] openURL:navigationAction.request.URL]; } decisionHandler(WKNavigationActionPolicyAllow);}

這種方法的優點是不存在漏洞問題、使用靈活,可以實現 H5 和 Native 頁面的無縫切換。例如在某一頁面需要快速上線的情況下,先開發出 H5 頁面。某一鏈接填寫的是 H5 鏈接,在對應的 Native 頁面開發完成前先跳轉至 H5 頁面,待 Native 頁面開發完后再進行攔截,跳轉至 Native 頁面,此時 H5 的鏈接無需進行修改。但是使用 iframe.src 來發送URL Scheme需要對 URL 的長度作控制,使用復雜,速度較慢。

重寫 prompt 等原生 JS 方法

Android 4.2 之前注入對象的接口是 addJavaScriptInterface ,但是由于安全原因慢慢不被使用。一般會通過修改瀏覽器的部分 Window 對象的方法來完成操作。主要是攔截 alert、confirm、prompt、console.log 四個方法,分別被Webview的 onJsAlert、onJsConfirm、onConsoleMessage、onJsPrompt 監聽。其中 onJsPrompt 監聽的代碼如下:

public boolean onJsPrompt(WebView view, String origin, String message, String defaultValue, final JsPromptResult result) { String handledRet = parentEngine.bridge.promptOnJsPrompt(origin, message,defaultValue); xxx; return true;}

iOS 由于安全機制,WKWebView對 alert、confirm、prompt 等方法做了攔截,如果通過此方式進行 Native 與 JS 交互,需要實現WKWebView的三個WKUIDelegate代理方法。代碼示例如下:

-(void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler{ UIAlertController *alertController = [UIAlertController alertControllerWithTitle:nil message:message?:@'' preferredStyle:UIAlertControllerStyleAlert]; [alertController addAction:([UIAlertAction actionWithTitle:@'確認' style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { completionHandler(); }])]; [self presentViewController:alertController animated:YES completion:nil];}

使用該方式時,可以與 Android 和 iOS 約定好使用傳參的格式,這樣 H5 可以無需識別客戶端,傳入不同參數直接調用 Native 即可。剩下的交給客戶端自己去攔截相同的方法,識別相同的參數,進行自己的處理邏輯即可實現多端表現一致。如:

alert('確定xxx?', '取消', '確定', callback());

另外,如果能與 Native 確定好方法名、傳參等調用的協議規范,這樣其它格式的 prompt 等方法是不會被識別的,能起到隔離的作用。

##### 注入 API

基于Webview提供的能力,我們可以向 Window 上注入對象或方法。JS 通過這個對象或方法進行調用時,執行對應的邏輯操作,可以直接調用 Native 的方法。使用該方式時,JS 需要等到 Native 執行完對應的邏輯后才能進行回調里面的操作。

Android 的Webview提供了 addJavascriptInterface 方法,支持 Android 4.2 及以上系統。

gpcWebView.addJavascriptInterface(new JavaScriptInterface(), ’nativeApiBridge’); public class JavaScriptInterface { Context mContext; JavaScriptInterface(Context c) { mContext = c; } public void share(String webMessage){// Native 邏輯 }}

JS 調用示例:

window.NativeApi.share(xxx);

iOS 的UIWebview提供了 JavaScriptScore 方法,支持 iOS 7.0 及以上系統。WKWebview提供了 window.webkit.messageHandlers 方法,支持 iOS 8.0 及以上系統。UIWebview在幾年前常用,目前已不常見。以下為創建WKWebViewConfiguration和 創建 WKWebView 示例:

WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];WKPreferences *preferences = [WKPreferences new];preferences.javaScriptCanOpenWindowsAutomatically = YES;preferences.minimumFontSize = 40.0;configuration.preferences = preferences; - (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; [self.webView.configuration.userContentController addScriptMessageHandler:self name:@'share']; [self.webView.configuration.userContentController addScriptMessageHandler:self name:@'pickImage'];}- (void)viewWillDisappear:(BOOL)animated{ [super viewWillDisappear:animated]; [self.webView.configuration.userContentController removeScriptMessageHandlerForName:@'share']; [self.webView.configuration.userContentController removeScriptMessageHandlerForName:@'pickImage'];}

JS 調用示例:

window.webkit.messageHandlers.share.postMessage(xxx);Native 調用 JS

Native 調用 JS 比較簡單,只要 H5 將 JS 方法暴露在 Window 上給 Native 調用即可。

Android 中主要有兩種方式實現。在 4.4 以前,通過 loadUrl 方法,執行一段 JS 代碼來實現。在 4.4 以后,可以使用 evaluateJavascript 方法實現。loadUrl 方法使用起來方便簡潔,但是效率低無法獲得返回結果且調用的時候會刷新 WebView。evaluateJavascript 方法效率高獲取返回值方便,調用時候不刷新WebView,但是只支持 Android 4.4+。相關代碼如下:

webView.loadUrl('javascript:' + javaScriptString);webView.evaluateJavascript(javaScriptString, new ValueCallback<String>() { @Override public void onReceiveValue(String value){ xxx }});

iOS 在WKWebview中可以通過 evaluateJavaScript:javaScriptString 來實現,支持 iOS 8.0 及以上系統。

// swiftfunc evaluateJavaScript(_ javaScriptString: String, completionHandler: ((Any?, Error?) -> Void)? = nil)// javaScriptString 需要調用的 JS 代碼// completionHandler 執行后的回調// objective-c[jsContext evaluateJavaScript:@'ZcyJsBridge(ev, data)']JSBridge 的使用

如何引用

由 H5 引用 在我司移動端初期版本時采用的是該方式,采用本地引入npm包的方式進行調用。這種方式可以確定 JSBridge 是存在的,可直接調用 Native 方法。但是如果后期 Bridge 的實現方式改變,雙方需要做更多的兼容,維護成本高 由 Native 注入 這是當前我司移動端選用的方式。在考慮到后期業務需要的情況下,進行了重新設計,選用 Native 注入的方式來引用 JSBridge。這樣有利于保持 API 與 Native 的一致性,但是缺點是在 Native 注入的方法和時機都受限,JS 調用 Native 之前需要先判斷 JSBridge 是否注入成功

使用規范

H5 調用 Native 方法的偽代碼實例,如:

params = { api_version: 'xxx', // API 版本 title: 'xxx', // 標題 filename: 'xxx', // 文件名稱 image: 'xxx', // 圖片鏈接 url: 'xxx', // 網址鏈接 success: function (res) { xxx; // 調用成功后執行 }, fail: function (err) { if (err.code == ’-2’) { fail && fail(err); // 調用了當前客戶端中不存在的 API 版本 } else { const msg = err.msg; //異常信息 Toast.fail(msg); } }};window.NativeApi.share(params);

以下簡要列出通用方法的抽象,目前基本遵循以下規范進行雙端通信。

window.NativeApi.xxx({ api_version:’’, name: 'xxx', path: 'xxx', id: 'xxx', success: function (res) { console.log(res); }, fail: function (err) { console.log(err); }});

由于初期版本選擇了由 H5 本地引用 JSBridge,后期采用 Native 注入的方式。現有的 H5 需要對各種情況做兼容,邏輯抽象如下:

reqNativeBridge(vm, fn) { if (!isApp()) { // 如果不在 APP 內進行調用 vm.$dialog.alert({ message: '此功能需要訪問 APP 才能使用', }); } else { if (!window.NativeApi) { // 針對初期版本 vm.$dialog.alert({message: '請更新到最新 APP 使用該功能', }); } else { // 此處只針對“調用了當前客戶端中不存在的 API 版本”的報錯進行處理 // 其余種類的錯誤信息交由具體的業務去處理 fn && fn((err) => {vm.$dialog.alert({ message: '請更新到最新 APP 使用該功能',}); }); } }}總結

上述內容簡要介紹了 JSBridge 的部分原理,希望對從未了解過 JSBridge 的同學能有所幫助。如果需要更深入的了解 JSBridge 的原理和實現,如 JSBridge 接口調用的封裝實現,JS 調用 Native 時的回調的唯一性等。大家可以去查閱更多資料,參考更詳細的相關文檔或他人的整理成文的沉淀。

以上就是Javascript之JSBridge初探的詳細內容,更多關于Javascript之JSBridge的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 卓能JOINTLEAN端子连接器厂家-专业提供PCB接线端子|轨道式端子|重载连接器|欧式连接器等电气连接产品和服务 | 沙盘模型公司_沙盘模型制作公司_建筑模型公司_工业机械模型制作厂家 | 钢托盘,铁托盘,钢制托盘,镀锌托盘,饲料托盘,钢托盘制造商-南京飞天金属13260753852 | 陕西视频监控,智能安防监控,安防系统-西安鑫安5A安防工程公司 | vr安全体验馆|交通安全|工地安全|禁毒|消防|安全教育体验馆|安全体验教室-贝森德(深圳)科技 | PSI渗透压仪,TPS酸度计,美国CHAI PCR仪,渗透压仪厂家_价格,微生物快速检测仪-华泰和合(北京)商贸有限公司 | 贴片电容-贴片电阻-二三极管-国巨|三星|风华贴片电容代理商-深圳伟哲电子 | 语料库-提供经典范文,文案句子,常用文书,您的写作得力助手 | 上海瑶恒实业有限公司|消防泵泵|离心泵|官网 | 石家庄网站建设|石家庄网站制作|石家庄小程序开发|石家庄微信开发|网站建设公司|网站制作公司|微信小程序开发|手机APP开发|软件开发 | 智能汉显全自动量热仪_微机全自动胶质层指数测定仪-鹤壁市科达仪器仪表有限公司 | 冷水机,风冷冷水机,水冷冷水机,螺杆冷水机专业制造商-上海祝松机械有限公司 | 电机铸铝配件_汽车压铸铝合金件_发动机压铸件_青岛颖圣赫机械有限公司 | 智慧消防-消防物联网系统云平台 智能化的检漏仪_气密性测试仪_流量测试仪_流阻阻力测试仪_呼吸管快速检漏仪_连接器防水测试仪_车载镜头测试仪_奥图自动化科技 | 旋振筛|圆形摇摆筛|直线振动筛|滚筒筛|压榨机|河南天众机械设备有限公司 | 培训中心-海南香蕉蛋糕加盟店技术翰香原中心官网总部 | 上海质量认证办理中心 | 六自由度平台_六自由度运动平台_三自由度摇摆台—南京全控科技 | 北京易通慧公司从事北京网站优化,北京网络推广、网站建设一站式服务商-北京网站优化公司 | 全自动定氮仪-半自动凯氏定氮仪厂家-祎鸿仪器| 超声波成孔成槽质量检测仪-压浆机-桥梁预应力智能张拉设备-上海硕冠检测设备有限公司 | 多米诺-多米诺世界纪录团队-多米诺世界-多米诺团队培训-多米诺公关活动-多米诺创意广告-多米诺大型表演-多米诺专业赛事 | 切铝机-数控切割机-型材切割机-铝型材切割机-【昆山邓氏精密机械有限公司】 | 排烟防火阀-消防排烟风机-正压送风口-厂家-价格-哪家好-德州鑫港旺通风设备有限公司 | 河南空气能热水器-洛阳空气能采暖-洛阳太阳能热水工程-洛阳润达高科空气能商行 | 聚合氯化铝-碱式氯化铝-聚合硫酸铁-聚氯化铝铁生产厂家多少钱一吨-聚丙烯酰胺价格_河南浩博净水材料有限公司 | 政府园区专业委托招商平台_助力企业选址项目快速落地_东方龙商务集团 | 欧版反击式破碎机-欧版反击破-矿山石料破碎生产线-青州奥凯诺机械 | 千淘酒店差旅平台-中国第一家针对TMC行业的酒店资源供应平台 | 浴室柜-浴室镜厂家-YINAISI · 意大利设计师品牌 | 咿耐斯 |-浙江台州市丰源卫浴有限公司 | 药品仓库用除湿机-变电站用防爆空调-油漆房用防爆空调-杭州特奥环保科技有限公司 | 内窥镜-工业内窥镜厂家【上海修远仪器仪表有限公司】 | ALC墙板_ALC轻质隔墙板_隔音防火墙板_轻质隔墙材料-湖北博悦佳 | 佛山市钱丰金属不锈钢蜂窝板定制厂家|不锈钢装饰线条|不锈钢屏风| 电梯装饰板|不锈钢蜂窝板不锈钢工艺板材厂家佛山市钱丰金属制品有限公司 | 上海logo设计 | 防腐木批发价格_深圳_惠州_东莞防腐木厂家_森源(深圳)防腐木有限公司 | 平面钻,法兰钻,三维钻-山东兴田阳光智能装备股份有限公司 | 电动打包机_气动打包机_钢带捆扎机_废纸打包机_手动捆扎机 | 开业庆典_舞龙舞狮_乔迁奠基仪式_开工仪式-神挚龙狮鼓乐文化传媒 | 短信通106短信接口验证码接口群发平台_国际短信接口验证码接口群发平台-速度网络有限公司 | 挤出熔体泵_高温熔体泵_熔体出料泵_郑州海科熔体泵有限公司 |