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 ...
随机推荐
-
android 获取应用的当前版本号&;获取当前android系统的版本号
(转自:http://www.cnblogs.com/qsl568/archive/2012/03/14/2395636.html) 获取当前应用的版本号: private String getVer ...
-
java17
1:登录注册案例(理解) 2:Set集合(理解) (1)Set集合的特点 无序,唯一 (2)HashSet集合(掌握) A:底层数据结构是哈希表(是一个元素为链表的数组) B:哈希表底层依赖两个方法: ...
-
RS232,RS422串口标准小结
RS232和RS422都是广泛使用的异步串行接口标准.由于它们实现简单且占用IO口资源少,在低速传输下是不错的方案. RS232是单端走线,最高波特率为115200,传输最远距离不超过150米,它的逻 ...
-
Java的“友好的”访问指示符(修饰符)
如果根本不指定访问指示符,就象本章之前的所有例子那样,这时会出现什么情况呢?默认的访问没有关键字,但它通常称为"友好"(Friendly)访问.这意味着当前包内的其他所有类都能访问 ...
-
N900快捷键
Ctrl + C 复制文本 Ctrl + V 粘贴文本 Ctrl + X 剪切文本 Ctrl + A 全部选择 Ctrl + O 打开 Ctrl + N 新建 Ctrl + S 保存 Ctrl + Z ...
-
xcoj 1208 矩阵
赛场上一开始以为是递推,交了一发希望以为能卡着线过(毕竟是O(5N)的),结果WA了. 又以为是dp,最后半小时尝试各种YY...各种WA 实际上取每次transfer中最大的概率然后递推是不对的.. ...
-
VNC server grey screen under ubuntu 14.04
nstall these packages: apt-get install gnome-panel gnome-settings-daemon metacity nautilus gnome-ter ...
-
Java随机数
本章先讲解Java随机数的几种产生方式,然后通过示例对其进行演示. 广义上讲,Java中的随机数的有三种产生方式:(01). 通过System.currentTimeMillis()来获取一个当前时间 ...
-
EF实例创建问题
场景:CodeFirst 情况下,在控制器新建一个EF数据库对象,以便运行时进行表的初始化创建 Private DemoContext db=new DemoContext (): 问题:什么时候释放 ...
-
Linux下安装PostgreSQL 转载linux社区
Linux下安装PostgreSQL [日期:2016-12-25] 来源:Linux社区 作者:xiaojian [字体:大 中 小] 在Linux下安装PostgreSQL有二进制格式安装和 ...