zoukankan      html  css  js  c++  java
  • JSbridge 在Vue的封装与交互

    原文转自: 点我

    写在 JSbridge.js

    let isAndroid = navigator.userAgent.indexOf('Android') > -1 || navigator.userAgent.indexOf('Adr') > -1;
    let isiOS = !!navigator.userAgent.match(/(i[^;]+;( U;)? CPU.+Mac OS X/);
    
    //这是必须要写的,用来创建一些设置
    function setupWebViewJavascriptBridge(callback) {
        //Android使用
        if (isAndroid) {
            if (window.WebViewJavascriptBridge) {
                callback(WebViewJavascriptBridge)
            } else {
                document.addEventListener(
                    'WebViewJavascriptBridgeReady',
                    function () {
                        callback(WebViewJavascriptBridge)
                    },
                    false
                );
            }
            console.log('tag', '安卓')
            sessionStorage.phoneType = 'android'
        }
    
        //iOS使用
        if (isiOS) {
            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);
            console.log('tag', 'ios');
            sessionStorage.phoneType = 'ios'
        }
    }
    //注册回调函数,第一次连接时调用 初始化函数(android需要初始化,ios不用)
    setupWebViewJavascriptBridge(function (bridge) {
        if (isAndroid) {
            //初始化
            bridge.init(function (message, responseCallback) {
                var data = {
                    'Javascript Responds': 'Wee!'
                };
                responseCallback(data);
            })
        }
    })
    
    export default {
        // js调APP方法 (参数分别为:app提供的方法名  传给app的数据  回调)
        callHandler(name, data, callback) {
            setupWebViewJavascriptBridge(function (bridge) {
                bridge.callHandler(name, data, callback)
            })
        },
        // APP调js方法 (参数分别为:js提供的方法名  回调)
        registerHandler(name, callback) {
            setupWebViewJavascriptBridge(function (bridge) {
                bridge.registerHandler(name, function (data, responseCallback) {
                    callback(data, responseCallback)
                })
            })
        }
    }
    

      main.js中引入:

    import Bridge from './config/JSbridge.js'
    Vue.prototype.$bridge = Bridge
    

      组件中使用:
      方法名和app开发人员沟通好,这里js调app,app提供的方法是dataToAndroid;app调js,js提供的方法是dataToJs

    注册方法
      mounted(){
        this.getAPPDate()
      },
    
    js调app
      sendMsg(){
        let msg = this.msg
        this.$bridge.callHandler('dataToAndroid',msg,(res)=>{
          alert('获取app响应数据:'+res)
          this.test = res
        })
      },
    
    app调js
      getAPPDate(){
        this.$bridge.registerHandler('dataToJs', (data, responseCallback) => {
          alert('app主动调用js方法,传入数据:'+ data)
          responseCallback(data)
        })
      }
    

      

  • 相关阅读:
    算法-heapq模块优先队列
    用find命令删除某目录下及所有子目录中某类型的特定文件
    OpenStack虚拟机virtaulinterfance 网络设备在libvirt的代码梳理
    cinderclient命令行源码解析
    python 多个装饰器的调用顺序分析
    wsgi的environ变量
    Cirros镜像
    写入多个变量到配置文件【linux】
    SecureCRT 私钥登录ec2 报:A protocol error occurred.Too many authentication failures for ec2-user 解决
    S3上备份的json文件转存成parquet文件
  • 原文地址:https://www.cnblogs.com/myfate/p/12016025.html
Copyright © 2011-2022 走看看