js与ios交互使用WebViewJavascriptBridge如何写多个函数

发布于 2022-09-06 23:07:51 字数 3352 浏览 11 评论 0

//js与webview交互初始化
    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) {
        function followChange(data) {
            if (data == 1) {
                $(".btnFollow").removeClass("btnFollow-yes").addClass("btnFollow-no");
            } else {
                $(".btnFollow").removeClass("btnFollow-no").addClass("btnFollow-yes");
            }
        }
        $(".btnFollow").click(function () {
            var followStaus=1;
            if ($(this).is('.btnFollow-no')) {
                followStaus=1;
            } else {
                followStaus=2;
            }
            bridge.callHandler(
                'callMobileHandler',
                {"followStaus": followStaus, "deviceType": "ios"},
                function (response) {
                    if(response.followStaus==1){
                        $(this).removeClass("btnFollow-yes").addClass("btnFollow-no");
                    }else{
                        $(this).removeClass("btnFollow-no").addClass("btnFollow-yes");
                    }
            });
        });
        bridge.registerHandler('callJSHandler', function (data, responseCallback) {
            followChange(data.followStaus);
//            responseCallback(responseData);
        });
        
        //以上代码实现的功能可以正常运行,以下代码实现的功能没有生效
        
        var imgs = document.getElementsByTagName("img");
        //传递图片src数组
        var imgsSrc=imgs.map(function (value,index) {
            return value.src
        });
        bridge.callHandler(
            'callMobileHandler',//名称待换
            {"imgList": imgsSrc, "deviceType": "ios"},//参数待换
            function (response) {//假设返回的src数组为imgList
                for(var i = 0;i< response.imgList.length; i++){
                    imgs[i].src=response.imgList[i];
                }
            });
        //js注册函数,没用可删除
        /*bridge.registerHandler('callJSHandler', function (data, responseCallback) {
         responseCallback(responseData);
         });*/
        //图片点击事件
        for(var i = 0;i< imgs.length; i++){
            imgs[i].onclick(function(){
                bridge.callHandler(
                    'callMobileHandler',//名称待换
                    {"currentImg": imgs[i].src, "deviceType": "ios"},//参数待换
                    function (response) {
                        //内容待写
                    });
                //js获得ios端参数函数,没用可删除
                /*bridge.registerHandler('callJSHandler', function (data, responseCallback) {
                 responseCallback(responseData);
                 });*/
            });
        }
    });

我想问一下我想写多个callhandle函数,是应该调用多次这个桥接函数呢,还是在一个函数里重复写几遍呢,或者是其他方法?目前只有第一个功能实现了,剩下的传递图片数组和图片点击事件都没有传递过去,该怎么办?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

近箐 2022-09-13 23:07:51

封装一下

import ua from './ua'

const callHandlers = []
const registerHandlers = []
const JCBridge = {
  call(...args) {
    callHandlers.push(args)
  },
  register(...args) {
    registerHandlers.push(args)
  },
}
const jsBridge = window.WebViewJavascriptBridge

/**
 * 获取ios 的bridge object
 * https://github.com/marcuswestin/WebViewJavascriptBridge
 * @param  {Function} initBridge [description]
 * @return {[type]}            [description]
 */
function initIosBridge(initBridge) {
  if (jsBridge) {
    return initBridge(jsBridge)
  }
  if (window.WVJBCallbacks) {
    return window.WVJBCallbacks.push(initBridge)
  }
  window.WVJBCallbacks = [initBridge]
  let doc = document
  let iframe = doc.createElement('iframe')
  iframe.style.display = 'none'
  iframe.src = 'wvjbscheme://__BRIDGE_LOADED__'
  doc.body.appendChild(iframe)
  setTimeout(() => {
    doc.body.removeChild(iframe)
  })
}

/**
 * 获取android 的bridge object
 * https://github.com/lzyzsd/JsBridge
 * @param  {Function} initBridge [description]
 * @return {[type]}            [description]
 */
function initAdrBridge(initBridge) {
  if (jsBridge) {
    return initBridge(jsBridge)
  }
  document.addEventListener('WebViewJavascriptBridgeReady', () => {
    // 后端派发时间之前会设置这个值
    initBridge(window.WebViewJavascriptBridge)
  }, false)
}

/**
 * 根据环境暴露bridge object
 * @param  {[type]} bridge [description]
 * @return {[type]}           [description]
 */
function initBridge(bridge) {
  bridge.init && bridge.init()
  if (bridge) {
    JCBridge.call = bridge.callHandler
    JCBridge.register = bridge.registerHandler

    if (callHandlers.length) {
      callHandlers.forEach(call => {
        JCBridge.call(...call)
      })
    }
    if (registerHandlers.length) {
      registerHandlers.forEach(register => {
        JCBridge.register(...register)
      })
    }
  }
}

if (ua.ios) {
  initIosBridge(initBridge)
} else if (ua.android) {
  initAdrBridge(initBridge)
}

export default JCBridge

// bridge.call  调用native提供的方法
// - bridge.call('setWebviewAttr', {}) 设置webview

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文