iOS OC與JS交互 WebViewJavascriptBridge

簡介

iOS 中經(jīng)常會(huì)出現(xiàn)webview與原生交互的問題,這里給大家分享一個(gè)很好用的第三方框架及使用方法。
WebViewJavascriptBridge

初始化Bridge

import "WebViewJavascriptBridge.h"

@property WebViewJavascriptBridge* bridge;

if (_bridge) { return; }
[WebViewJavascriptBridge enableLogging];    
_bridge = [WebViewJavascriptBridge bridgeForWebView:webView];
[_bridge setWebViewDelegate:self];

JS調(diào)用OC OC中實(shí)現(xiàn)代碼

/*
 含義:JS調(diào)用OC
 @param registerHandler 要注冊的事件名稱(比如這里我們?yōu)閘oginAction)
 @param handel 回調(diào)block函數(shù) 當(dāng)后臺(tái)觸發(fā)這個(gè)事件的時(shí)候會(huì)執(zhí)行block里面的代碼
 */
[_bridge registerHandler:@"loginAction" handler:^(id data, WVJBResponseCallback responseCallback) {
    // data js頁面?zhèn)鬟^來的參數(shù)  假設(shè)這里是用戶名和姓名,字典格式
    NSLog(@"JS調(diào)用OC,并傳值過來");
    
    // 利用data參數(shù)處理自己的邏輯
    NSDictionary *dict = (NSDictionary *)data;
    NSString *str = [NSString stringWithFormat:@"用戶名:%@  姓名:%@",dict[@"userId"],dict[@"name"]];
    
    
    // responseCallback 給后臺(tái)的回復(fù)
    responseCallback(@"報(bào)告,oc已收到j(luò)s的請求");
}];

OC調(diào)用JS OC中實(shí)現(xiàn)方法

/*
 含義:OC調(diào)用JS
 @param callHandler 商定的事件名稱,用來調(diào)用網(wǎng)頁里面相應(yīng)的事件實(shí)現(xiàn)
 @param data id類型,相當(dāng)于我們函數(shù)中的參數(shù),向網(wǎng)頁傳遞函數(shù)執(zhí)行需要的參數(shù)
 注意,這里callHandler分3種,根據(jù)需不需要傳參數(shù)和需不需要后臺(tái)返回執(zhí)行結(jié)果來決定用哪個(gè)
 */

//[_bridge callHandler:@"registerAction" data:@"我是oc請求js的參數(shù)"];
[_bridge callHandler:@"registerAction" data:@"uid:123 pwd:123" responseCallback:^(id responseData) {
    NSLog(@"oc請求js后接受的回調(diào)結(jié)果:%@",responseData);
}];

加載本地html

- (void)loadExamplePage:(UIWebView*)webView {
  NSString* htmlPath = [[NSBundle mainBundle] pathForResource:@"ExampleApp" ofType:@"html"];
  NSString* appHtml = [NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil];
  NSURL *baseURL = [NSURL fileURLWithPath:htmlPath];
  [webView loadHTMLString:appHtml baseURL:baseURL];
}

在JS里復(fù)制這個(gè)

<!-- 申明交互 -->
function setupWebViewJavascriptBridge(callback) {
    if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }
    if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }
    window.WVJBCallbacks = [callback];
    var WVJBIframe = document.createElement('iframe');
    WVJBIframe.style.display = 'none';
    WVJBIframe.src = 'https://__bridge_loaded__';
    document.documentElement.appendChild(WVJBIframe);
    setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
}


<!-- 處理交互  方法名要和ios內(nèi)定義的對應(yīng)-->

setupWebViewJavascriptBridge(function(bridge) {

    <!--處理 oc 調(diào)用 js -->
    bridge.registerHandler('registerAction', function(data, responseCallback) {
        //處理oc給的傳參
        alert('oc請求js  傳值參數(shù)是:'+data)
                           
        var responseData = { 'result':'handle success' }
        //處理完,回調(diào)傳值給oc
        responseCallback(responseData)
    })


    var callbackButton = document.getElementById('buttons').appendChild(document.createElement('button'))
    callbackButton.innerHTML = '點(diǎn)擊我,我會(huì)調(diào)用oc的方法'
    callbackButton.onclick = function(e) {
        e.preventDefault()
                             
        <!--處理 js 調(diào)用 oc -->
        bridge.callHandler('loginAction', {'userId':'zhangsan','name': '章三'}, function(response) {
             //處理oc過來的回調(diào)
             alert('收到oc過來的回調(diào):'+response)
        })
}
?著作權(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)容