zoukankan      html  css  js  c++  java
  • WebViewJavascriptBridge 进行js 与native通信。

    1,  iOS端加载web页面、开启日志并给webView建立JS与OC的桥梁

    - (void)viewWillAppear:(BOOL)animated {

        if (_bridge) { return; }

        

        // 1.加载网页

        UIWebView* webView = [[UIWebView alloc] initWithFrame:self.view.bounds];

        [self.view addSubview:webView];

        

        // 2.开启日志

        [WebViewJavascriptBridge enableLogging];

        

        // 3.webView建立JSOC的沟通桥梁

        _bridge = [WebViewJavascriptBridge bridgeForWebView:webView];

        [_bridge setWebViewDelegate:self];

        

        //JS调用OC通过重定向url并取handlerName来调用,

        //注册  js调用OC方法

        [_bridge registerHandler:@"readID" handler:^(id data, WVJBResponseCallback responseCallback) {

            NSLog(@"readID 读身份证 called: %@", data);

            responseCallback(@" readID back");

        }];

        

            

        [self renderButtons:webView];

        [self loadExamplePage:webView];

    }

          iOS端注册与前端JS中对应的方法,获得回调,然后我们就可以在回调中做我们需要做的操作。

    //OC 调用 js

    - (void)callHandler:(id)sender {

        

        id data = @{ @"greetingFromObjC": @"Hi there, oc调 JS!" };

        //OC调用JS通过stringByEvaluatingJavaScriptFromString调用。

        

        [_bridge callHandler:@"testJavascriptHandler" data:data responseCallback:^(id response) {

            NSLog(@" 回到OC文件啦---  oc调js  打印回调 testJavascriptHandler responded: %@", response);

        }];

    }

     //js 部分

    <script>

    window.onerror = function(err) {

    log('window.onerror: ' + err)

    }

        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)

        }

        setupWebViewJavascriptBridge(function(bridge) {

    var uniqueId = 1

    function log(message, data) {

    var log = document.getElementById('log')

    var el = document.createElement('div')

    el.className = 'logLine'

    el.innerHTML = uniqueId++ + '. ' + message + ':<br/>' + JSON.stringify(data)

    if (log.children.length) { log.insertBefore(el, log.children[0]) }

    else { log.appendChild(el) }

    }

            //oc调用js

            //H5调用 注册本地JS方法,注册后Native可通过JSBridge调用。调用后会将方法注册到本地变量messageHandlers 中

            //注册一个供原生调用的api

    bridge.registerHandler('testJavascriptHandler', function(data, responseCallback) {

    //log('ObjC called testJavascriptHandler with', data)

    var responseData = { 'JavascriptSays':' oc 调js 返回数据 Right back atcha!' }

                responseCallback(responseData)

    })

    document.body.appendChild(document.createElement('br'))

    var callbackButton = document.getElementById('buttons').appendChild(document.createElement('button'))

    callbackButton.innerHTML = 'Fire testObjcCallback'

    callbackButton.onclick = function(e) {

    e.preventDefault()

    log('JS calling handler "testObjcCallback"')

                

                //js调用oc

                //H5调用 调用原生开放的api,调用后实际上还是本地通过url scheme触发。调用时会将回调id存放到本地变量responseCallbacks中

    bridge.callHandler('readID', {'foo': 'bar'}, function(response) {

    log('JS got response', response)

    })

    }

    })

    </script>

            最后在dealloc方法调用清除缓存的方法:

  • 相关阅读:
    C# 5.0 in a Nutshell 读书笔记(一) 野峰
    CLR via C# 4th Edition 野峰
    杰佛里给 Windows Server 2019 Automation with PowerShell 一书所写序言 野峰
    .NET的跨平台调用一例(PreserveSig) 野峰
    Http请求响应
    为什么不要追随新的linux发行版
    make: *** [out/host/linuxx86/obj/STATIC_LIBRARIES/libgtest_host_intermediates/gtestall.o] Error change
    linux 下at&t语法的汇编之hello world!!
    android 编译错误001_cm9 for onda elite vi10
    把vim当作16进制编辑器使用、、
  • 原文地址:https://www.cnblogs.com/iOS-mt/p/10484748.html
Copyright © 2011-2022 走看看