iOS 使用WebViewJavascriptBridge完成OC與H5交互

現(xiàn)在的項(xiàng)目中,界面越來越復(fù)雜,混合編程已成一個(gè)趨勢,項(xiàng)目中嵌入H5已是必然的事,那么OC與H5交互就成一個(gè)問題了。其實(shí)交互就是OC與JS交互。

展示網(wǎng)頁可以使用UIWebView和WKWebView兩個(gè)控件,UIWebView占用的內(nèi)存大,這里我們使用WKWebView來完成交互。

1.導(dǎo)入WebViewJavascriptBridge

使用cocoapods導(dǎo)入,pod ‘WebViewJavascriptBridge’

2.引入頭文件

#import "WKWebViewJavascriptBridge.h"

///WKWebView

@property (nonatomic, strong) WKWebView *webView;

@property (nonatomic, strong) WKWebViewJavascriptBridge *bridge;

3.這是OC中的代碼

? ? self.webView = [[WKWebView alloc]initWithFrame:self.view.bounds];

? ? NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"demo" withExtension:@"html"]];

? ? [self.webViewloadRequest:request];

? ? [self.viewaddSubview:self.webView];

? ? //初始化bridge

? ? self.bridge = [WKWebViewJavascriptBridge bridgeForWebView:self.webView];

? ? [self.bridgeregisterHandler:@"setData"handler:^(iddata,WVJBResponseCallbackresponseCallback) {

? ? ? ? //這里的data為JS發(fā)送給OC的數(shù)據(jù)

? ? ? ? NSLog(@"----------%@", data);

? ? ? ? //OC調(diào)用JS

? ? ? ? [_bridge callHandler:@"getData" data:@"OC傳來的數(shù)據(jù)l, 哈哈哈"];

? ? }];

4.這是HTML中的代碼

? ? ? ? //必須添加的代碼

? ? ? ? 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)

? ? ? ? }

? ? ? ? //OC調(diào)用JS

? ? ? ? setupWebViewJavascriptBridge(function(bridge) {

?? ? ? ? ? ? bridge.registerHandler('getData',function(data, responseCallback) {

? ? ? ? ? ? ? ? //這里的data為OC發(fā)送給JS的數(shù)據(jù)

? ? ? ? ? ? ? ? document.getElementById('content').innerHTML = data;

? ? ? ? ? ? })

?? ? ? ? })

? ? ? ? //按鈕點(diǎn)擊事件

? ? ? ? functiongetData() {

? ? ? ? ? ? //JS調(diào)用OC

? ? ? ? ? ? window.WebViewJavascriptBridge.callHandler('setData','點(diǎn)擊了按鈕的事件');

? ? ? ? }


點(diǎn)擊效果前


點(diǎn)擊效果后

Demo地址:Demo地址

如有不同意見請指出,共同改正。

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

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

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