WebViewJavascriptBridge使用總結(jié)

WebViewJavascriptBridge

github地址:WebViewJavascriptBridge

使用實例

使用的WebViewJavascriptBridge版本為5.0.5。本文記錄UIWebView和JS交互的基本使用同衣,也算是對WebViewJavascriptBridge初步認(rèn)識穿挨。

ViewController頁面分析

初始化

創(chuàng)建WebViewJavascriptBridge

    _bridge = [WebViewJavascriptBridge bridgeForWebView:_webViewjs];
    [_bridge setWebViewDelegate:self];   

初始化方法:bridgeForWebView實現(xiàn)如下

+ (instancetype)bridgeForWebView:(WVJB_WEBVIEW_TYPE*)webView {
    WebViewJavascriptBridge* bridge = [[self alloc] init];
    [bridge _platformSpecificSetup:webView];
    return bridge;
}
//調(diào)用如下方法
- (void) _platformSpecificSetup:(WVJB_WEBVIEW_TYPE*)webView {
    _webView = webView;
    _webView.delegate = self;
    _base = [[WebViewJavascriptBridgeBase alloc] init];
    _base.delegate = self;
}

內(nèi)部初始化了一個WebViewJavascriptBridgeBase對象粉臊,并對_webView和_base賦值槽唾。

注冊一個方法,用來響應(yīng)JS調(diào)用

- (void)registShareFunction {
    [_bridge registerHandler:@"ShareClick" handler:^(id data, WVJBResponseCallback responseCallback) {
        NSLog(@"-----分享數(shù)據(jù):%@", data);
        //實現(xiàn)需要的操作
    }];
}

參數(shù):ShareClick是handler的名字窖铡,與網(wǎng)頁中JS調(diào)用的handler名字相同(寫錯了就慢慢找吧琅豆,別問我是怎么知道的)。data是JS發(fā)送過來的數(shù)據(jù)允乐。responseCallback回調(diào)數(shù)據(jù)給JS矮嫉。

注冊一個方法,用來調(diào)用JS

  [_bridge callHandler:@"OCtoJS" data:@"一個字符串" responseCallback:^(id responseData) {
        NSLog(@"%@", responseData);
    }];

參數(shù)說明:OCtoJS是handler名字牍疏。data發(fā)送給JS的數(shù)據(jù)蠢笋。responseCallback響應(yīng)JS的回調(diào)。

下面是ViewController完整代碼

#import "ViewController.h"
#import <WebViewJavascriptBridge.h>
#import "SecondViewController.h"
@interface ViewController ()<UIWebViewDelegate>
@property (weak, nonatomic) IBOutlet UIWebView *webViewjs;
@property (nonatomic, strong) WebViewJavascriptBridge *bridge;
@end
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(right)];
    [WebViewJavascriptBridge enableLogging];
    _bridge = [WebViewJavascriptBridge bridgeForWebView:_webViewjs];
    [_bridge setWebViewDelegate:self];
    [self loadExamplePage:_webViewjs];
    [self registShareFunction];
}
- (void)right{
    [_bridge callHandler:@"OCtoJS" data:@"一個字符串" responseCallback:^(id responseData) {
        NSLog(@"%@", responseData);
    }];
}
- (void)loadExamplePage:(UIWebView*)webView {
    NSString* htmlPath = [[NSBundle mainBundle] pathForResource:@"jsDemo" ofType:@"html"];
    NSString* appHtml = [NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil];
    NSURL *baseURL = [NSURL fileURLWithPath:htmlPath];
    [webView loadHTMLString:appHtml baseURL:baseURL];
}
- (void)registShareFunction {
    [_bridge registerHandler:@"ShareClick" handler:^(id data, WVJBResponseCallback responseCallback) {
        NSLog(@"-----分享數(shù)據(jù):%@", data);
        //實現(xiàn)需要的操作
        SecondViewController *secondVC = [[SecondViewController alloc] init];
        UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:secondVC];
        [self presentViewController:nav animated:YES completion:^{
            responseCallback(@"分享成功");
        }];
    }];
}
@end

index.html頁面分析

配置index.html

WebViewJavascriptBridge是通過攔截URL來實現(xiàn)調(diào)用原生功能鳞陨。下面是html中必須配置的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 = 'wvjbscheme://__BRIDGE_LOADED__';
    document.documentElement.appendChild(WVJBIframe);
    setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
}

具體如何實現(xiàn)的這里不多分析,請自行Google厦滤。

注冊方法援岩,用來OC響應(yīng)調(diào)用。

setupWebViewJavascriptBridge(function(bridge) {
        bridge.registerHandler('OCtoJS', function(data, responseCallback) {
                alert('JS方法被調(diào)用' + data);
                responseCallback('JS執(zhí)行過了');
        })
    })

只有在setupWebViewJavascriptBridge中注冊的方法才能被OC調(diào)用掏导∠砘常可以在其中定義多個方法用來響應(yīng)OC。注意OCtoJS和前面handler名稱是對應(yīng)的碘菜。

JS調(diào)用OC方法

function ShareClick(){
    var item = '我是JS發(fā)送來的數(shù)據(jù)';
    WebViewJavascriptBridge.callHandler('ShareClick',item, function(response){
        alert('response');
    })
}

index.html完整代碼

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1.0, maximum-scale=1.0">
    <title>測試</title>
</head>
<body>
    <script type="text/javascript">
       
        function ShareClick(){

 //監(jiān)聽程序
        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 = 'wvjbscheme://__BRIDGE_LOADED__';
            document.documentElement.appendChild(WVJBIframe);
            setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)
        }
        setupWebViewJavascriptBridge(function(bridge) {
            bridge.registerHandler('OCtoJS', function(data, responseCallback) {
                    alert('JS方法被調(diào)用' + data);
                    responseCallback('JS執(zhí)行過了');
            })
        })


            var item = '我是JS發(fā)送來的數(shù)據(jù)';
            WebViewJavascriptBridge.callHandler('ShareClick',item, function(response){

            })
        }
    </script>
    <button id="button" onclick="ShareClick()">點擊調(diào)用支付寶</button>
</body>
</html>

小結(jié)

使用WebViewJavascriptBridge可以很方便的實現(xiàn)OC與JS之間交互凹蜈。
另外使用在交互限寞,獲取參數(shù)方面都比較簡潔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仰坦,一起剝皮案震驚了整個濱河市履植,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌悄晃,老刑警劉巖玫霎,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異妈橄,居然都是意外死亡庶近,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進(jìn)店門眷蚓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鼻种,“玉大人,你說我怎么就攤上這事沙热〔嬖浚” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵篙贸,是天一觀的道長投队。 經(jīng)常有香客問我,道長爵川,這世上最難降的妖魔是什么敷鸦? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮寝贡,結(jié)果婚禮上扒披,老公的妹妹穿的比我還像新娘。我一直安慰自己兔甘,他們只是感情好谎碍,可當(dāng)我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布鳞滨。 她就那樣靜靜地躺著洞焙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拯啦。 梳的紋絲不亂的頭發(fā)上澡匪,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音褒链,去河邊找鬼唁情。 笑死,一個胖子當(dāng)著我的面吹牛甫匹,可吹牛的內(nèi)容都是我干的甸鸟。 我是一名探鬼主播惦费,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼抢韭!你這毒婦竟也來了薪贫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤刻恭,失蹤者是張志新(化名)和其女友劉穎瞧省,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鳍贾,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡鞍匾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了骑科。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片橡淑。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖咆爽,靈堂內(nèi)的尸體忽然破棺而出梳码,到底是詐尸還是另有隱情,我是刑警寧澤伍掀,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布掰茶,位于F島的核電站,受9級特大地震影響蜜笤,放射性物質(zhì)發(fā)生泄漏濒蒋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一把兔、第九天 我趴在偏房一處隱蔽的房頂上張望沪伙。 院中可真熱鬧,春花似錦县好、人聲如沸围橡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翁授。三九已至,卻和暖如春晾咪,著一層夾襖步出監(jiān)牢的瞬間收擦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工谍倦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留塞赂,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓昼蛀,卻偏偏與公主長得像宴猾,于是被迫代替她去往敵國和親圆存。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,947評論 2 355

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