WebViewJavascriptBridge為OC和JS建立橋梁

webView對于每個iOS程序員并不陌生鲫尊,故JSOC的交互是每個iOS程序員必須掌握的技能洲胖。而JSOC就好比兩塊沒有交集的大陸希停,如果想要使它們相互通信就必須要建立一座“橋梁”下隧。然而它咨演,WebViewJavascriptBridge為我們建立了一座"橋梁"。好用风纠,好用的一塌糊涂况鸣,好用的無法無天,好用的不講道理竹观!
而且镐捧,微信也使用了這個庫。
注意:建議大家去github上看官方文檔以及demo臭增,不僅簡單還特別詳細!

那么現(xiàn)在我們來看看懂酱,怎么使用這個強大的庫!

集成

對于H5兄弟而已誊抛,他需要復制并粘貼 setupWebViewJavascriptBridge 到他的 JS 里列牺。

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

對于我們而已,只需集成即可芍锚。
1.將此添加到您的podfile并運行pod安裝以安裝:

pod 'WebViewJavascriptBridge', '~> 6.0'

2.導入頭文件

#import <WebViewJavascriptBridge/WebViewJavascriptBridge.h>

3..m文件

#import <WebViewJavascriptBridge/WebViewJavascriptBridge.h>

@interface ViewController () <UIWebViewDelegate>

@property (nonatomic, strong) UIWebView *webView;
@property WebViewJavascriptBridge* bridge;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    [self.view addSubview:self.webView];
    
    // 開啟WebViewJavascriptBridge 默認日志顯示昔园,例如打印的 “WVJB SEND:” 之類的
    [WebViewJavascriptBridge enableLogging];
    
    // 初始化WebViewJavascriptBridge 對象
    self.bridge = [WebViewJavascriptBridge bridgeForWebView:self.webView];
    
    // 設置WebViewJavascriptBridge 對象的代理
    [self.bridge setWebViewDelegate:self];
}

JS 調(diào)用 OC

示例

JS

setupWebViewJavascriptBridge(function(bridge) {
    
    bridge.callHandler('ObjC Echo', {'key':'value'}, function responseCallback(responseData) {
        console.log("JS received response:", responseData) // oc回調(diào)的數(shù)據(jù)
    })
})

OC

[self.bridge registerHandler:@"ObjC Echo" handler:^(id data, WVJBResponseCallback responseCallback) {
    NSLog(@"ObjC Echo called with: %@", data); // 接收js的數(shù)據(jù)
    responseCallback(data);
}];

ObjC Echo:方法名,兩端保持一致!
{'key':'value'}js傳給oc的數(shù)據(jù)并炮,可為空默刚!
dataoc接收js的數(shù)據(jù)!
responseCallback(data)oc回調(diào)給js數(shù)據(jù)逃魄,可以空荤西!
responseDatajs接收回調(diào)數(shù)據(jù),可為空伍俘!

場景1

點擊webview上的按鈕邪锌,跳轉(zhuǎn)到原生界面,不帶任何參數(shù)癌瘾!

JS

setupWebViewJavascriptBridge(function(bridge) {
            bridge.callHandler('getMycluesIos', {'foo': null}, function(response) {
                
            })
        })

OC

    [self.bridge registerHandler:@"getMycluesIos" handler:^(id data, WVJBResponseCallback responseCallback) {
        // 直接跳轉(zhuǎn)界面
        MyClueViewController *myClueVC = [[MyClueViewController alloc] init];
        [self.navigationController pushViewController:myClueVC animated:YES];
    }];
場景2

點擊webview上的按鈕觅丰,跳轉(zhuǎn)到原生界面,點擊時帶參數(shù)給原生界面妨退。

JS

setupWebViewJavascriptBridge(function(bridge) {
            bridge.callHandler('getCluesDataIos', {'cluesdata': clues}, function(response) {
                
            })
        })

OC

[self.bridge registerHandler:@"getCluesDataIos" handler:^(id data, WVJBResponseCallback responseCallback) {

        // data為json字符串
        if ([[self dictionaryWithJsonString:data[@"cluesdata"]][@"code"] isEqual:@1]) {
            
            ClueDetailViewController *clueDetailVC = [[ClueDetailViewController alloc] init];
            clueDetailVC.leadsInfoId = [self dictionaryWithJsonString:data[@"cluesdata"]][@"data"][@"id"];
            clueDetailVC.nameString = [self dictionaryWithJsonString:data[@"cluesdata"]][@"data"][@"customName"];
            clueDetailVC.brandString = [self dictionaryWithJsonString:data[@"cluesdata"]][@"data"][@"intentionCar"];
            clueDetailVC.stateString = [self dictionaryWithJsonString:data[@"cluesdata"]][@"data"][@"leadsStatusName"];
    
            [self.navigationController pushViewController:clueDetailVC animated:YES];
        }else {
            
            [UIFactory creatTipsWithTitle:[self dictionaryWithJsonString:data[@"cluesdata"]][@"msg"] view:self.view];
        }
    }];

OC 調(diào)用 JS

示例

OC

[self.bridge callHandler:@"JS Echo" data:nil responseCallback:^(id responseData) {
    NSLog(@"ObjC received response: %@", responseData);//JS回調(diào)數(shù)據(jù)
}];

JS

setupWebViewJavascriptBridge(function(bridge) {
    
    bridge.registerHandler('JS Echo', function(data, responseCallback) {
        console.log("JS Echo called with:", data)//接收OC數(shù)據(jù)
        responseCallback(data)
    })
})

JS Echo:方法名妇萄,兩端保持一致!
datajs接收oc的數(shù)據(jù)!
responseCallback(data)js回調(diào)給oc數(shù)據(jù)咬荷,可為空冠句!
responseDataoc接收回調(diào)數(shù)據(jù)!

場景1

點擊h5上的按鈕幸乒,彈出原生控件(比如時間選擇框)懦底,把數(shù)據(jù)傳給h5界面!(只實現(xiàn)后半部分)

OC

[self.bridge callHandler:@"sendQudaoIos" data:@{@"dom":@"dkqd",@"text": model.canalName,@"id":model.channelId} responseCallback:^(id responseData) {
                        
                    }];

JS

setupWebViewJavascriptBridge(function(bridge) {
    
    bridge.registerHandler('sendQudaoIos', function(data, responseCallback) {
        console.log("data)罕扎;
    })
})

數(shù)據(jù)交互因它而變的簡單了聚唐!

推薦一篇文章:
深入剖析 WebViewJavascriptBridge

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丐重,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拱层,更是在濱河造成了極大的恐慌弥臼,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件根灯,死亡現(xiàn)場離奇詭異径缅,居然都是意外死亡,警方通過查閱死者的電腦和手機烙肺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門纳猪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人桃笙,你說我怎么就攤上這事氏堤。” “怎么了搏明?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵鼠锈,是天一觀的道長。 經(jīng)常有香客問我星著,道長购笆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任虚循,我火速辦了婚禮同欠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘横缔。我一直安慰自己铺遂,他們只是感情好,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布茎刚。 她就那樣靜靜地躺著襟锐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膛锭。 梳的紋絲不亂的頭發(fā)上捌斧,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機與錄音泉沾,去河邊找鬼。 笑死妇押,一個胖子當著我的面吹牛跷究,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播敲霍,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼俊马,長吁一口氣:“原來是場噩夢啊……” “哼丁存!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起柴我,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤解寝,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后艘儒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體聋伦,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年界睁,在試婚紗的時候發(fā)現(xiàn)自己被綠了觉增。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡翻斟,死狀恐怖逾礁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情访惜,我是刑警寧澤嘹履,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站债热,受9級特大地震影響砾嫉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜阳柔,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一焰枢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舌剂,春花似錦济锄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至避消,卻和暖如春低滩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背岩喷。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工恕沫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人纱意。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓婶溯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子迄委,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容