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é)別忘記改源碼。
