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方法调用清除缓存的方法:

WebViewJavascriptBridge 进行js 与native通信。的更多相关文章

  1. WKWebView 里 JS 和 native 通信的例子

    native 端 初始化 wkwebview,设置 message handler webView = WKWebView.init() let usecc = self.webView.config ...

  2. Android混合开发之WebViewJavascriptBridge实现JS与java安全交互

    前言: 为了加快开发效率,目前公司一些功能使用H5开发,这里难免会用到Js与Java函数互相调用的问题,这个Android是提供了原生支持的,不过存在安全隐患,今天我们来学习一种安全方式来满足Js与j ...

  3. js与native交互

    js与native交互 UIWebView Native调用JS,使用stringByEvaluatingJavaScriptFromString来解释执行js脚本. //script即为要执行的js ...

  4. js与native的交互

    WebView与Javascript交互(Android): WebView与Javascript交互是双向的数据传递,1.H5网页的JS函数调用Native函数 2.Native函数调用JS函数,具 ...

  5. Qtl和JS、HTML通信/交互

    http://www.cnblogs.com/sigma0/p/7346727.html Qt的QWebChannel和JS.HTML通信/交互驱动百度地图 0 前言 我一个研究嵌入式的,不知道怎么就 ...

  6. iOS JS 和 OC交互 / JS 和 native 相互调用

    现在app 上越来越多需求是通过UIWebView 来展示html 或者 html5的内容, js 和 native OC代码交互 就非常常见了. js 调用 native  OC代码 第一种机制 ( ...

  7. Qt的QWebChannel和JS、HTML通信/交互驱动百度地图

    Qt的QWebChannel和JS.HTML通信/交互驱动百度地图 0 前言 我一个研究嵌入式的,不知道怎么就迷上了上位机,接了几个项目都是关于Qt,这个项目还是比较经典的,自己没事儿的时候也进行研究 ...

  8. Android 利用WebViewJavascriptBridge 实现js和java的交互(一)

    此文出自:http://blog.csdn.net/sk719887916/article/details/47189607,skay 按安卓开发目前现状来说,开发者大部分时间还是花在UI的屏幕适配上 ...

  9. vue 项目使用JSbrideg.js与app通信

    一.建立JSbrideg.js文件 var jsBridge = {     isAndroid: null,     isIOS: null,     callHandlerFunc: functi ...

随机推荐

  1. Spring Boot 项目实战(四)集成 Redis

    一.前言 上篇介绍了接口文档工具 Swagger 及项目监控工具 JavaMelody 的集成过程,使项目更加健壮.在 JAVA Web 项目某些场景中,我们需要用缓存解决如热点数据访问的性能问题,业 ...

  2. linux 学习笔记 rpm命令

    软件包管理 用rpm命令来管理rpm 软件包 1>遵循GPL 规则 2>安装 foo-2.0-1.i386.rpm软件包 #rpm -ivh foo-1.0-1.i386.rpm 3> ...

  3. XamarinAndroid组件教程RecylerView动画组件使用动画(3)

    XamarinAndroid组件教程RecylerView动画组件使用动画(3) (8)打开Main.axml文件,构建主界面.代码如下: <?xml version="1.0&quo ...

  4. BZOJ.2565.[国家集训队]最长双回文串(Manacher/回文树)

    BZOJ 洛谷 求给定串的最长双回文串. \(n\leq10^5\). Manacher: 记\(R_i\)表示以\(i\)位置为结尾的最长回文串长度,\(L_i\)表示以\(i\)开头的最长回文串长 ...

  5. Java并发编程(二)-- 创建、运行线程

    Java线程 Java线程类也是一个object类,它的实例都继承自java.lang.Thread或其子类. Java可以用如下方式创建一个线程: Tread thread = new Thread ...

  6. Meanshift算法学习

    ref:参考自:这里(目标跟踪) Meanshift图像分割:这里 最近看到FT算法使用meanshift算法进行显著图的分割,于是就来学习他的姿势 对于集合中的每一个元素,对它执行下面的操作:把该元 ...

  7. python学习—几个简单小程序

    1. 输出1到100的偶数 #!/usr/bin/env python # -*- coding:utf-8 -*- #定义初始值 start=1 while True: #判断start的值若其为5 ...

  8. java里的基本数据类型和引用数据类型

    一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768 ...

  9. this-11.1-笔记

    1. 基本数据类型:string   undefined   null  boolean  number 引用数据类型  Object  array  function 1.2  二者的区别 基本数据 ...

  10. [原创]Robo 3T 1.2.1 工具使用介绍

    [原创]Robo 3T 1.2.1 工具使用介绍 1 Robo 3T 1.2.1  简介 robo 3t 是一款MongoDB的辅助插件,可以帮助您在管理数据库内容以及数据库代码编辑方面提供一定的开发 ...