日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

Javascript之JSBridge初探

瀏覽:22日期: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 注入的方式?,F有的 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
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
综合亚洲视频| 免费成人在线影院| 国产精品**亚洲精品| 日韩福利视频一区| 久久国产成人| 日韩精品一区二区三区中文字幕| 日本成人中文字幕| 国产精品视频首页| 97精品中文字幕| 久久一区二区中文字幕| 亚洲精品在线观看91| 亚洲涩涩av| 国产欧美日韩在线一区二区| 精品中文在线| 亚洲午夜视频| 香蕉久久久久久| 麻豆国产精品视频| 日本欧美不卡| 在线观看亚洲精品福利片| 亚洲精品三级| 丰满少妇一区| 成人av二区| 日本天堂一区| 精品日韩视频| 日韩美女精品| 日韩欧美一区免费| 最新国产精品视频| 日韩久久视频| 日韩高清电影免费| 日韩精品专区| 日韩在线电影| 一本大道色婷婷在线| 五月激激激综合网色播| 激情视频网站在线播放色| 亚洲欧美日韩高清在线| 日韩国产欧美一区二区三区| 欧美sm一区| 欧美日韩a区| 欧美中文一区二区| 国产日产精品_国产精品毛片| 久久久久99| 欧美日韩一区二区三区不卡视频| 欧美日韩国产v| 欧美精品影院| 国产真实久久| 国产精品男女| 亚洲精品网址| 亚洲三级欧美| 久久黄色影视| 免费av一区| 美腿丝袜亚洲一区| 中文一区一区三区免费在线观| 精品国产一区二区三区av片| 一区二区三区午夜视频| 成人日韩在线观看| 精品一区二区三区的国产在线观看 | 正在播放日韩精品| 日本va欧美va瓶| 夜夜嗨av一区二区三区网站四季av| 精品国产成人| 亚洲18在线| 国产尤物精品| 高清av不卡| 国产精品第一| 亚洲综合福利| 日韩午夜一区| 91精品婷婷色在线观看| 国内精品亚洲| 国产精品天天看天天狠| 亚洲色图国产| 国产精品婷婷| 欧美在线资源| 国内精品福利| 亚洲电影有码| 久久电影tv| 麻豆精品新av中文字幕| 午夜精品影视国产一区在线麻豆| 99香蕉国产精品偷在线观看| 丝袜美腿诱惑一区二区三区| 水蜜桃久久夜色精品一区| 麻豆精品视频在线观看| 国产精品久久| 麻豆久久一区| 成人亚洲一区二区| 久久久久久久欧美精品| 亚洲影视一区二区三区| 亚洲一区网站| 亚洲黄色在线| 久久国产影院| 久久视频精品| 伊人久久大香线蕉av不卡| 欧美好骚综合网| 国产成人黄色| 日韩深夜视频| 亚洲福利精品| 久久福利影视| 日韩欧美中文字幕在线视频| 日韩av一二三| 久久99精品久久久久久园产越南| 麻豆精品视频在线观看| 国产一区国产二区国产三区| 日本一区二区免费高清| 国产一区丝袜| 日韩在线免费| 久久久久亚洲| 日韩视频精品在线观看| 中日韩男男gay无套| 首页欧美精品中文字幕| 丝袜美腿亚洲一区二区图片| 色8久久久久| 国产欧美高清| 亚洲综合电影| 日韩亚洲精品在线| 日韩精品a在线观看91| 国产精品一站二站| 日韩成人a**站| 在线日韩欧美| 亚洲免费资源| 美女免费视频一区| 视频小说一区二区| 丝袜美腿亚洲一区| 国产精品红桃| 日韩成人精品一区| 婷婷亚洲五月| 日韩国产精品久久久久久亚洲| 美腿丝袜在线亚洲一区| 日韩不卡免费高清视频| 噜噜噜躁狠狠躁狠狠精品视频| 免费看欧美美女黄的网站| 国产精品手机在线播放| 欧美日韩视频网站| 免费在线观看精品| 欧美国产不卡| 欧美成人综合| 国产欧美亚洲一区| 国产字幕视频一区二区| 日韩精品一区二区三区中文在线| 国产精品调教视频| 激情综合网站| 欧美日韩一区自拍| 99久久九九| 国产欧美日韩精品一区二区免费| 色婷婷久久久| 久久精品97| 婷婷综合社区| 久久在线91| 丝袜美腿成人在线| 国产精品久久久久蜜臀| 久久午夜影视| 98精品视频| 日韩毛片网站| 亚洲性视频h| 国产调教一区二区三区| 婷婷综合在线| 国产+成+人+亚洲欧洲在线| 玖玖精品视频| 波多野结衣久久精品| 日本精品另类| 欧美日韩四区| 福利一区视频| 青青草91视频| 91久久在线| 97人人精品| 国产福利一区二区精品秒拍 | 青草综合视频| 亚洲精品电影| 日韩精品中文字幕第1页| 国产日韩亚洲欧美精品| 亚洲激情中文| 日韩欧美中文| 精品视频网站| 国产剧情一区二区在线观看| 蜜臀久久99精品久久久久宅男 | a日韩av网址| 日韩福利视频导航| 亚洲欧美日本国产专区一区| 日韩精品中文字幕第1页| 91精品丝袜国产高跟在线| 亚洲欧美伊人| 国产精品麻豆久久| 麻豆精品在线播放| 欧美伊人影院| 美国欧美日韩国产在线播放| 欧美亚洲国产一区| 日韩欧美午夜| 国产精品久久久久久久久久10秀| 国产精品免费精品自在线观看| 日韩精品免费观看视频| 首页国产欧美久久| 国产精品美女| 9国产精品视频| 欧美日韩亚洲在线观看| 精品国产一区二区三区性色av| 97久久超碰| 97精品资源在线观看| 亚洲欧美在线专区| 免费视频最近日韩| 午夜宅男久久久| 尹人成人综合网| 老牛影视一区二区三区|