H5与安卓和ios通信

一、将方法挂载window上面

h5调用原生

安卓:window.native.getSign()

ios:    window.webkit.messageHandlers.getSign.postMessage('')

原生调用h5

window.onPage = function (data) {
  // 前端处理逻辑
}

二、引入JsBridge(安卓)或WebViewJavascriptBridge(iOS)库的方案

function setupWebViewJavascriptBridge(callback) {
  //Andriod使用
  if (window.WebViewJavascriptBridge) {
       callback(WebViewJavascriptBridge)
  } else {
       document.addEventListener(
           'WebViewJavascriptBridgeReady'
           , function() {
               callback(WebViewJavascriptBridge)
           },
           false
       );
  }
  // ios处理
  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) {
  //web定义一个funParam方法让app调用data接收app传过来的参数(uid token)
    bridge.callHandler("handleShare", {
       title:title,
       subtitle:'',
       desc:desc,
       link:link,
       imgUrl:imgUrl
    },function(data) {
       alert('分享成功')
        
    });
})

 

不引入JsBridge(安卓)或WebViewJavascriptBridge(iOS)库的方案

function createIframeCall(url) {
  setTimeout(function() {
    var iframe = document.createElement('iframe');
    iframe.style.width = '1px';
    iframe.style.height = '1px';
    iframe.style.display = 'none';
    iframe.src = url;
    document.body.appendChild(iframe);
    setTimeout(function() {
        document.body.removeChild(iframe);
    }, 100);
  }, 0);
}

createIframeCall('jsbridge://handleShare?title='+title+'&url='+link+'&desc='+desc+'&img='+imgUrl+'');

 封装

JsBridge = {
    doCall: function(functionName, data, callback) {
        var _this = this;
        // 解决连续调用问题
        if (this.lastCallTime && (Date.now() - this.lastCallTime) < 100) {
            setTimeout(function() {
                _this.doCall(functionName, data, callback);
            }, 100);
            return;
        }
        this.lastCallTime = Date.now();
    
        data = data || {};
        if (callback) {
            $.extend(data, { callback: callback });
        }
    
        if (UA.isIOS()) {
            $.each(data, function(key, value) {
                if ($.isPlainObject(value) || $.isArray(value)) {
                    data[key] = JSON.stringify(value);
                }
            });
            var url = Args.addParameter('youzanjs://' + functionName, data);
            var iframe = document.createElement('iframe');
            iframe.style.width = '1px';
            iframe.style.height = '1px';
            iframe.style.display = 'none';
            iframe.src = url;
            document.body.appendChild(iframe);
            setTimeout(function() {
                iframe.remove();
            }, 100);
        } else if (UA.isAndroid()) {
            window.androidJS && window.androidJS[functionName] && window.androidJS[functionName](JSON.stringify(data));
        } else {
            console.error('未获取platform信息,调取api失败');
        }
    }
}
JsBridge.doCall("handleShare", {
       title:title,
       subtitle:'',
       desc:desc,
       link:link,
       imgUrl:imgUrl
},function(data) {
   alert('分享成功')
    
});

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值