h5与native的通信函数,基于url schema的做法

全局配置信息区域

// 全局配置信息,方便配置
var hxsConfigBridge = {
    globalBridgeName:"hxsHybrid",
    globalBridgeObject:"hxsNativeBride"
}

工具函数定义区域


window[hxsConfigBridge.globalBridgeName] =  window[hxsConfigBridge.globalBridgeName] || {};


//全局注册唯一的客户端函数,给app端去调用客户端
function requestHybrid ( params){

    if (! params.tagName ){
        alert("必须包括tagName");
        return;
    }

    var tt = (new Date().getTime() ) + "_"+ Math.random() + '_';

    var t = hxsConfigBridge.globalBridgeName +'_'+ params.tagName + '_' + tt;
    
    var tmpFn;

    //处理有回调的情况下
    if( params.callback ){
        tmpFn = params.callback;
        // 后面有用
        params.callbackT = t;

        window[hxsConfigBridge.globalBridgeName][t] = function (data){
            tmpFn( data)
        }
        
    }
    // 发送数据函数
    bridgePostMsg( params )
}

// 拼接处理Url
function getHybridUrl( params ){
    var k,paramStr = '',
    url = hxsConfigBridge.globalBridgeName +'://'+params.tagName,
    flag = '?';
    if( params.callback ){
        flag = '&';
        url += '?callback='+ params.callbackT
    }

    if( params.param ){
        if ( typeof params.param == 'object' ){
            paramStr = JSON.stringify(params.param)
        }
        
        url = url + flag +  'param='+ encodeURIComponent(paramStr );
    }

    // hxsHybrid://?callback=callbackId
    return url;
}

// 使用iframe发起 url schema 给app端
function bridgePostMsg ( params){

    var url = getHybridUrl( params);

    //兼容ios6 用 iframe
    var ifr = document.createElement('iframe');  
    ifr.id = params.callbackId; 
    ifr.src = url;   
    ifr.onload = function() {   
        console.log('iframe onload loaded');   
    };
    
    if( navigator.userAgent.indexOf("Android") > -1 ){
        // 安卓发太快 有问题
        setTimeout(function(){
            document.body.appendChild(ifr);  
        },10)
    }else{
        document.body.appendChild(ifr);  
    }
    
    setTimeout(function(){
        document.body.appendChild(ifr);  
        ifr.remove();
        ifr = null;
    },1000)

}


// 封装分享按钮的函数
window[hxsConfigBridge.globalBridgeObject] =  window[hxsConfigBridge.globalBridgeObject] || {};

window[hxsConfigBridge.globalBridgeObject].shareBtnInApp = function (param = {}, callback) {
    requestHybrid({
        tagName:"shareBtnInApp",
        param:param,
        callback:function(data){
            callback(data)
        }
    })
}

-----------------

具体的场景去调用 shareBtnInApp函数

var __param = {
   name:"wwb",
   age:32 
}
window[hxsConfigBridge.globalBridgeObject].shareBtnInApp( __param, function(data){
    // data是app返回的数据
    // 根据app返回的data数据格式来处理业务

    // {
    //     code:200,
    //     data:{
    //         name:'jerry',
    //         work:"前端开发"
    //     }
    // }

    if(data.code == 200){
        alert("回调成功了")
    }
})

参考:
https://www.imooc.com/learn/850

《h5与native的通信函数,基于url schema的做法》

    原文作者:明道_Jerry
    原文地址: https://segmentfault.com/a/1190000012250418
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞