html与ios交互方法 WebViewJavascriptBridge
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了html与ios交互方法 WebViewJavascriptBridge,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含8188字,纯文字阅读大概需要12分钟。
内容图文
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是异步的,首先执行同步任务,再执行异步任务
做个测试看看执行顺序
<!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全部内容,希望文章能够帮你解决html与ios交互方法 WebViewJavascriptBridge所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。