html与ios交互方法 WebViewJavascriptBridge
WebViewJavascriptBridge
1.html调用ios的方法
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script>
$(function () {
//iOS用于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)
}
// setupWebViewJavascriptBridge(function(bridge) {
// // native调用js
// // bridge.registerHandler('jsHandlerName', function(data, responseCallback) {
// // // data为ObjC传递给JS的数据
// // console.log("JS Echo called with:", data)
// // // js返回数据给Objc
// // responseCallback('返回一个字符串,告诉ObjC:我已收到数据data')
// // })
// // js调用native的方法
// bridge.callHandler('getUserCoorCallback', '获取用户位置信息经纬度的回调', function responseCallback(res) {
// // responseData返回的数据
// alert(res)
// })
// })
function getData(name,data){
setupWebViewJavascriptBridge(function(bridge) {
// native调用js
// bridge.registerHandler('jsHandlerName', function(data, responseCallback) {
// // data为ObjC传递给JS的数据
// console.log("JS Echo called with:", data)
// // js返回数据给Objc
// responseCallback('返回一个字符串,告诉ObjC:我已收到数据data')
// })
// js调用native的方法
bridge.callHandler(name,data, function responseCallback(res) {
// responseData返回的数据
alert('位置信息:'+res)
})
})
}
alert('执行1')
getData('getUserCoorCallback', '获取用户位置信息经纬度的回调')
alert('执行2')
})
</script>
</body>
</html>
打印结果
//执行1
//执行2
//位置信息: 22.581529;113971377
注意:setupWebViewJavascriptBridge是异步的,首先执行同步任务,再执行异步任务
$(function () {
//iOS用于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)
}
//native调用js
setupWebViewJavascriptBridge(function (bridge) {
bridge.registerHandler('articleDetailViewInit', function (data, responseCallback) {
//字符串分割成一个数组
responseCallback('文章详情界面初始化成功');
})
})
//js调用native
function rewardBtnClickCallback(uid) {
WebViewJavascriptBridge.callHandler('rewardBtnClickCallback', uid, function (response) {
alert('native被调用:' + response);
});
}
})
做个测试看看执行顺序
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script>
$(function () {
//iOS用于js交互必备代码:
function setupWebViewJavascriptBridge(callback) {
alert('1')
if (window.WebViewJavascriptBridge) {
alert('7')
return callback(WebViewJavascriptBridge);
}
if (window.WVJBCallbacks) {
alert('8')
return window.WVJBCallbacks.push(callback);
}
window.WVJBCallbacks = [callback];
alert('2')
var WVJBIframe = document.createElement('iframe');
WVJBIframe.style.display = 'none';
WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
document.documentElement.appendChild(WVJBIframe);
alert('3')
setTimeout(function () {
alert('4')
document.documentElement.removeChild(WVJBIframe)
}, 0)
}
function getData(name,data){
setupWebViewJavascriptBridge(function(bridge) {
alert(5)
bridge.callHandler(name,data,function responseCallback(res) {
alert(6)
alert(res)
})
})
}
getData('getUserCoorCallback', '获取用户位置信息经纬度的回调')
})
</script>
</body>
</html>
执行顺序会按照alert 1-6 依次执行,不执行 7和8
再做测试 执行两次
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
<script>
$(function () {
//iOS用于js交互必备代码:
function setupWebViewJavascriptBridge(callback) {
alert('1')
if (window.WebViewJavascriptBridge) {
alert('7')
return callback(WebViewJavascriptBridge);
}
if (window.WVJBCallbacks) {
alert('8')
return window.WVJBCallbacks.push(callback);
}
window.WVJBCallbacks = [callback];
alert('2')
var WVJBIframe = document.createElement('iframe');
WVJBIframe.style.display = 'none';
WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';
document.documentElement.appendChild(WVJBIframe);
alert('3')
setTimeout(function () {
alert('4')
document.documentElement.removeChild(WVJBIframe)
}, 0)
}
function getData(name,data){
setupWebViewJavascriptBridge(function(bridge) {
alert(5)
bridge.callHandler(name,data,function responseCallback(res) {
alert(6)
alert(res)
})
})
}
getData('getUserCoorCallback', '获取用户位置信息经纬度的回调')
getData('getUserCoorCallback', '获取用户位置信息经纬度的回调')
// 执行顺序1 2 3 1 8 4 5 5 6 经纬度 6 经纬度
})
</script>
</body>
</html>
执行顺序按照1 2 3 1 8 4 5 5 6 经纬度 6 经纬度
2.vue调用ios的方法
步骤1.新建bridge.js文件
在src下新建lib目录 新建 bridge.js文件 也可以把文件放在config目录下
function setupWebViewJavascriptBridge (callback) {
if (window.WebViewJavascriptBridge) {
return callback(window.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)
}
export default {
callhandler (name, data, callback) {
setupWebViewJavascriptBridge(function (bridge) {
bridge.callHandler(name, data, callback)
})
},
registerhandler (name, callback) {
setupWebViewJavascriptBridge(function (bridge) {
bridge.registerHandler(name, function (data, responseCallback) {
callback(data, responseCallback)
})
})
}
}
步骤2.引入bridge.js文件
方式1:全局引入
//main.js文件 //bridge.js放在lib目录下 // import Bridge from '../src/lib/bridge' Vue.prototype.$bridge = Bridge //bridge.js放在config目录下 import Bridge from '../config/bridge' Vue.prototype.$bridge = Bridge
方式2:局部引入
在组件内
<script>//对应bridge.js的路径
import Bridge from '../lib/bridge'
//或者
import Bridge from '../../config/bridge'export default{
}<script>
步骤3.使用
全局引入的方式
//全局引入调用 对应步骤2的方式1
this.$bridge.callhandler('getUserCoorCallback', "获取用户位置信息经纬度的回调", (data) => {
// 处理返回数据
alert(data)
})
//局部引入调用 对应步骤2的方式2
Bridge.callhandler('getUserCoorCallback', "获取用户位置信息经纬度的回调", (data) => {
// 处理返回数据
alert(data)
})
但是按照网上的方法以上步骤都无法获取到WebViewJavascriptBridge对象,
本人尝试在vue 根目录下的index.html文件上加上,然后马上执行setupWebViewJavascriptBridge(),才终于获取到WebViewJavascriptBridge对象,原因不明。有知道原因的朋友请解答一下。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>活动</title>
</head>
<body>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
<script>
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()
</script>
</html>
补充:
第一次交互的时候,alert(this.$bridge)为Object
当我们尝试看看WebViewJavascriptBridge,alert(WebViewJavascriptBridge) 或 alert(window.WebViewJavascriptBridge)都是undefined,
本人马大哈,把方法名callhandler打callHandler了。因为export default导出的是一个对象,他有两个方法。1是callhandler(name,data,callback),2是registerhandler(name,callback)。
当一开始执行的时候WebViewJavascriptBridge是undefined,因为没有执行callhandler方法来执行 setupWebViewJavascriptBridge ,所以alert(WebViewJavascriptBridge) 是undefined。
执行完setupWebViewJavascriptBridge后,我们才能在ios中获取到WebViewJavascriptBridge对象,从而实现html与ios的交互。
//错误
this.$bridge.callHandler('getUserCoorCallback', "获取用户位置信息经纬度的回调", (data) => {
// 处理返回数据
alert(data)
})
//正确
this.$bridge.callhandler('getUserCoorCallback', "获取用户位置信息经纬度的回调", (data) => {
// 处理返回数据
alert(data)
})

html与ios交互方法 WebViewJavascriptBridge的更多相关文章
- iOS与HTML5交互方法总结(转)
今天小编在找技术文章的时候,发现这样一个标题:iOS与HTML5交互方法总结,怎么看着这么熟悉呢? 还以为是刚哥用了别的文章,点进去一看,原来是刚哥自己写的文章,他们转载的,而且还上了Dev St ...
- iOS与HTML5交互方法总结(修正)
摘要 看了不少别人写的博客或者论坛,关于iOS与HTML5交互方法大概主要有5种方式: 1. 利用WKWebView进行交互(系统API) 2. 利用UIWebView进行交互(系统API) 3. 苹 ...
- Unity3D与iOS消息交互方法(1)--iOS接收Unity3D发出的消息
跨平台这种事情不管多NB, 总要有些与原生系统交互的方法, 比如 Unity3D与iOS消息交互方法. 一: 建立一个空的Unity工程. File --> New Project 二: 编 ...
- OC与JS交互之WebViewJavascriptBridge
上一篇文章介绍了通过UIWebView实现了OC与JS交互的可能性及实现的原理,并且简单的实现了一个小的示例DEMO,当然也有一部分遗留问题,使用原生实现过程比较繁琐,代码难以维护.这篇文章主要介绍下 ...
- h5与安卓、ios交互
1.安卓交互 h5调用安卓方法 window.webview.xxx() 安卓调用h5方法, 方法需要在全局注册 window['showUnreadMsg'] = () => { this.$ ...
- UNITY3D与iOS交互解决方案
原地址:http://bbs.18183.com/thread-456979-1-1.html 本帖最后由 啊,将进酒 于 2014-2-27 11:17 编辑 “授人以鱼,不如授人以渔”,以UNIT ...
- Unity与IOS交互
Unity IOS交互 @By 广州小龙 QQ群:63438968 环境:Mac os 10.9.2 Unity 4.2.1f4 Xcode 5.0.2 Unity IOS的交互我写过一个教程 ...
- js和android及ios交互
Android中Java和JavaScript交互 这种交互,Hybrid App 会用的比较多一点, 本文将介绍如何实现Java代码和Javascript代码的相互调用. Android提供了一个很 ...
- Unity与安卓IOS交互
记录下 安卓与Unity交互中 跳坑 找到的资料. <1>建立交互 http://blog.csdn.net/lizhengwei1989/article/details/54631 ...
随机推荐
- 如何开发使用自定义文件的OEM应用程序
有关创建和使用自定义数据文件的详细信息,请参阅DISM应用程序包(.appx或.appxbundle)服务命令行选项. 了解如何开发使用自定义文件的应用程序,将信息从OEM传递到应用程序. 对于您为O ...
- js 一些工具函数
1.js金钱转换类 这是一个远古时期的函数,拿来分享一下,它将输入的数字保留2位小数并补0 function formatAsMoney(mnt) { mnt -= 0; mnt = (Math.ro ...
- #Java学习之路——基础阶段二(第三篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- Kubernetes的DaemonSet(上篇)
背景 静儿作为美团容器化团队HULK的一员,经常需要和Kubernetes(k8s)打交道.第一次登陆node(宿主机)的时候,发现连续登陆几台都看到了Prometheus-Node-Exporter ...
- 记录DEV gridview获取行列数据方法
DataRow dr = this.gridView1.GetDataRow(this.gridView1.FocusedRowHandle);//获取选中行 string str = gridVie ...
- 用Python教你微信防撤回(文本、图片、语音、视频、名片等...)
大家在使用微信过程中,有时候消息还没看到,就被撤回了.毕竟好奇心大家都有,明知到消息被撤回了,就更想去看一下是什么内容心里想着万一是女神给我表白了呢.. 今天就用Python来做个微信防撤回的小功能. ...
- 从PRISM开始学WPF(三)Prism-Region-更新至Prism7.1
[7.1update]在开始前,我们先看下版本7.1中在本实例中的改动. 首先,项目文件中没有了Bootstrapper.cs,在上一篇的末尾,我们说过了,在7.1中,不见推荐使用Bootstrapp ...
- 【资料总结】| Deep Reinforcement Learning 深度强化学习
在机器学习中,我们经常会分类为有监督学习和无监督学习,但是尝尝会忽略一个重要的分支,强化学习.有监督学习和无监督学习非常好去区分,学习的目标,有无标签等都是区分标准.如果说监督学习的目标是预测,那么强 ...
- Java开发笔记(八十二)注解的基本单元——元注解
Java的注解非但是一种标记,还是一种特殊的类型,并且拥有专门的类型定义.前面介绍的五种内置注解,都可以找到对应的类型定义代码,例如查看注解@Override的源码,发现它的代码定义是下面这样的: @ ...
- redis.conf常用配置说明
最近学了 Redis,在 Linux 上安装的,接下来就简单讲解一下修改 Redis 配置文件 修改密码: 新安装的 Redis 是默认没有密码的,可以给Redis设置一个密码 先进入 Redis 的 ...