iOS JS與OC交互

博文參考:

鏈接1: iOS與網(wǎng)頁JS交互,3中方法實現(xiàn)
鏈接2:IOS中 使用JavaScriptCore 實現(xiàn)OC與JS的交互
鏈接3:WebViewJavascriptBridge的基本原理

我要實現(xiàn)的功能:

給web頁傳入經(jīng)緯度和城市名字,顯示出該城市的地鐵線路圖,效果如下


實現(xiàn)過程

這里實現(xiàn)OC與JS的交互使用的是第三方:WebViewJavascriptBridge,簡單方便,既然是第三方,那么使用cocoapods導(dǎo)入最方便
1.準(zhǔn)備工作
首先新建工程,使用cocoapods導(dǎo)入WebViewJavascriptBridge

platform :ios,'10.0'
target 'OCAndJS’ do
 pod "WebViewJavascriptBridge",'~>5.0.5'
end

然后在需要使用的第三方API的地方引入頭文件

#import <WebViewJavascriptBridge/WebViewJavascriptBridge.h>

最后將H5界面對應(yīng)的文件拖入到工程中



2.OC代碼
首先添加webView,遵循UIWebViewDelegate

//添加webView
self.webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 20, kScreenWidth, kScreenHeight)];
self.webView.delegate = self;
[self.view addSubview:self.webView];
//加載H5頁面
NSString *resoucePath = [[NSBundle mainBundle] resourcePath];
NSString * filePath = [resoucePath stringByAppendingPathComponent:@"index.html"];
NSString * html = [[NSString alloc] initWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
[self.webView loadHTMLString:html baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];

添加OC和JS橋接對象

@property(nonatomic,strong)WebViewJavascriptBridge * bridge;//橋接對象

開啟橋接對象,關(guān)聯(lián)OC和JS

    //js與oc交互傳值---打開方式WebViewJavascriptBridge
    [WebViewJavascriptBridge enableLogging];//開啟日志
    self.bridge = [WebViewJavascriptBridge bridgeForWebView:self.webView];// 給哪個webview建立JS與OjbC的溝通橋梁
    [_bridge setWebViewDelegate:self];//設(shè)置webView代理
    //js與oc交互傳值---OC給JS傳值
    [self.bridge callHandler:@"testJavascriptHandler" data:@{@"latitude":[NSNumber numberWithFloat:28.199439],@"lontitude":[NSNumber numberWithFloat:113.022366],@"cityName":@"長沙"}];
    //js與oc交互傳值---注冊接收從js傳傳過來的值的理者,唯一標(biāo)識是“ testObjcCallback”,與js中代碼相對應(yīng)
    [self.bridge registerHandler:@"testObjcCallback" handler:^(id data, WVJBResponseCallback responseCallback) {
        //這里面獲取在H5界面返回的值,在data中
        NSLog(@"%@",data);
        responseCallback(@"Response from testObjcCallback");//block里面的值可以傳到j(luò)s中去,可以不寫
    }];

3.JS代碼
首先是公共代碼

//與OC交互的所有JS方法都要放在此處注冊,才能調(diào)用通過JS調(diào)用OC或者讓OC調(diào)用這里的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)
      }

綁定的彈出框事件

    function bindEvent(){
        setupWebViewJavascriptBridge(function(bridge) {
            bridge.registerHandler('testJavascriptHandler', function(data, responseCallback) {
                city = data.cityName;
                bdLng = data.lontitude;
                bdLat = data.latitude;
                                   
                window.cbk();
            });

            $('.js_start_tap').off('touchstart').on('touchstart', function(event) {
                var name = $(this).attr('data-name');
                bridge.callHandler('testObjcCallback', {'name':name, 'type':'start'}, function(response) {});
            });
            $('.js_end_tap').off('.touchstart').on('touchstart', function(event) {
                var name = $(this).attr('data-name');
                bridge.callHandler('testObjcCallback', {'name':name,'type':'end'}, function(response) {});
            });
        });
    }

其中js傳值到oc的代碼

//這部分的代碼寫在H5中需要傳值的操作處
bridge.callHandler('testObjcCallback', {'name':name,'type':'end'}, function(response) {});

而js獲取oc中的值的代碼

//寫到合適的地方就可以
bridge.registerHandler('testJavascriptHandler', function(data, responseCallback) {
                city = data.cityName;
                bdLng = data.lontitude;
                bdLat = data.latitude; 
                window.cbk();
            });
Demo下載地址
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

  • 剛剛開始找工作時去一家公司面試 公司要求點擊網(wǎng)頁上面的button來調(diào)用oc里面的方法。剛開始覺得很簡單就說會做。...
    小羅哦吧閱讀 519評論 0 7
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,291評論 4 61
  • 1 我有一個不喜歡我學(xué)習(xí)的朋友。 我們聊天的時候,她從不談學(xué)習(xí),比如我提到我們的寫作組她就完全不感興趣,一副拒絕的...
    無尾熊自成長閱讀 255評論 0 1
  • 我是個畫盲,不懂得欣賞畫,寫實的畫還能當(dāng)照片欣賞下,抽象的就更看不明白了。有時我就在自己琢磨,現(xiàn)在照相技術(shù)這么先進(jìn)...
    預(yù)言嘉閱讀 2,448評論 0 3
  • 清晨與傍晚 老狗與提岸 坐在故鄉(xiāng)的三月 冬天的滅絕 之后,是乍暖還寒 異鄉(xiāng)的城市 春天和冬天一樣寒冷 沒有雨和雪 ...
    鹿原先生和蓬蒿閱讀 174評論 0 4

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