WKWebViewJavascriptBridge 遇到的坑

H5和原生端交互,用WebViewJavascriptBridge其實(shí)挺簡(jiǎn)單的。只要參照github上的Demo即可。

注意點(diǎn)一:如果注冊(cè)了bridge后,與H5的調(diào)用無法成功,檢查一下H5小伙伴代碼里有沒有以下片段。這一段JS代碼是不能改的,必須原樣copy。

functionsetupWebViewJavascriptBridge(callback){if(window.WebViewJavascriptBridge) {returncallback(WebViewJavascriptBridge); }if(window.WVJBCallbacks) {returnwindow.WVJBCallbacks.push(callback); }window.WVJBCallbacks = [callback];varWVJBIframe =document.createElement('iframe');? ? WVJBIframe.style.display ='none';? ? WVJBIframe.src ='wvjbscheme://__BRIDGE_LOADED__';document.documentElement.appendChild(WVJBIframe);? ? setTimeout(function(){document.documentElement.removeChild(WVJBIframe) },0)}

如果沒有這段js代碼,紅框里的代碼就不會(huì)執(zhí)行。

這句代碼[_base injectJavascriptFile]是注入js文件,也是交互的關(guān)鍵。在執(zhí)行這行代碼之前,有這么一個(gè)判斷[_base isBridgeLoadedURL:url]。點(diǎn)進(jìn)去查看,具體方法如下:

-(BOOL)isBridgeLoadedURL:(NSURL*)url {return([[url scheme] isEqualToString:kCustomProtocolScheme] && [[url host] isEqualToString:kBridgeLoaded]);}/*#define kCustomProtocolScheme @"wvjbscheme"#define kQueueHasMessage? ? ? @"__WVJB_QUEUE_MESSAGE__"#define kBridgeLoaded? ? ? ? @"__BRIDGE_LOADED__"*/

如果H5代碼不加上述規(guī)定的js代碼,那么這個(gè)if語句里傳入的url永遠(yuǎn)都是最原始傳入html的地址,return NO,因此也就不會(huì)執(zhí)行[_base injectJavascriptFile]。

注意點(diǎn)二:Run以后發(fā)現(xiàn)Crash了,在官網(wǎng)的Demo里也同樣會(huì)Crash。原因是某個(gè)回調(diào)調(diào)用了多次。這個(gè)Crash只有在WKWebView會(huì)發(fā)生,用UIWebView是好的。

解決方法如下,加一行代碼即可。參考issue。不知為何,作者始終沒有合并這個(gè)issue也沒有修復(fù)這個(gè)bug,所以通過cocoapods集成的同學(xué)別忘記改源碼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容