h5与app(android,ios)端交互

4 篇文章 0 订阅

app和h5页面交互,可以使用vue项目构建的页面,也可以使用原生的html页面等等
下面两种方式都会介绍
原理分析:
1)h5和app之间通过url 传递数据
2)app会提供一个接口对象的引用(即app端留着h5调用的方法)

app 中嵌入vue页面

原生和vue交互
vue调用app方法如下:
1.在vue项目中可以创建一个全局方法 (也可以单独写,封装起来更好些)

/**
 *js调用APP
 * @params {*} Obj  传给app参数
 * messageName 是 为ios和安卓端提供的方法名(即调用的android和ios的方法名)
 */
// vue 与安卓和ios交互 :调用安卓和ios方法
export function JSToNativeAPP(messageName, params) {
  params = params || ''
  const isAndroid = navigator.userAgent.indexOf('Android') > -1 || navigator.userAgent.indexOf('Adr') > -1
  if (isAndroid) {
    window.android[messageName](JSON.stringify(params))
  } else {
    window.webkit.messageHandlers[messageName].postMessage(params)
  }
}


2.使用
先在用的地方导入该方法
eg: import { JSToNativeAPP } from './utils/common.js'
在需要调用的地方调一下
eg:

// 调用安卓和ios方法
    JSToNativeAPP('getUser')

3.调用完之后,如果需要接收app返回给我们的参数怎么接收呢?接收参数方式如下
注意:接收参数的方法需要挂载到window上, eg: window.getToken = this.getToken
接收参数的方法其实就是提供给app端供他们调用的,只有全局方法可以调用,私有方法是不行的

getToken(params) {
      localStorage.setItem('ticket', params)

      // Dialog.alert({
      //   title: '标题',
      //   message: localStorage.getItem('village')
      // }).then(() => {
      //   // on close

      // })
    }

至此app和vue交互完毕,接下来看app端和普通html的交互

app 中嵌入普通html页面

原生和普通html交互

具体步骤
1.发送给app端的ajax的请求封装

var ajaxMethod = function (url, params, type, callback) {
        var data;
        var u = navigator.userAgent;
        var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android终端
        var isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
       // console.log("android:" + isAndroid);
        //console.log("IOS:" + isIOS);
        if (isAndroid || isIOS) {     /向/安卓和ios发起请求
            delete params['token'];
            url = "ajax://" + url;    //url的协议(app端和h5共同决定),值可以任意取
            if (params) {
                url += "?";
                for (var key in params) {
                    url += key + "=" + params[key] + "&";
                }
                ;
            }
            $("<iframe style='display:none;' id='Frame" + count + "'></iframe>").prependTo('body');
            $("#Frame" + count).attr("src", url);
            count++;
        } else {  //普通的ajax请求,便于调试
            $.ajax({
                type: type,
                url: url,
                data: params,
                dataType: 'text',
                async: true,
                cache: false,
                complete: function (data) {

                },
                success: function (result) {
                    callback(result);
                },
                error: function () {
                    console.log("网络异常");
                }
            });
        }
    };

2.如果不需要请求数据(例如分享功能),只是触发app端的功能,那么方式为:

 if (isIOS) {  //调起ios端的事件的方式
	window.webkit.messageHandlers.事件名.postMessage(‘参数’);
  } else if (isAndroid) {  //触发安卓端
	 window.事件名.OnClick(‘参数’);
}

3.页面代码中的使用
1)引入封装的全局js文件
2)写js代码
eg:

//获取数据
        API.方法名(回调函数/不传,'回调函数名');
       1) app返回数据,是通过回调函数的函数名,并把这个数据返回到数据函数名对应的函数中;
        2) 在回调函数中会得到数据
        

eg:

$(function(){
	 API.queryInviteTokenAndErCode(httpPost.queryInviteTokenAndErCode,'httpPost.queryInviteTokenAndErCode')
})

  let httpPost= {
        queryInviteTokenAndErCode:function (res) {
            // console.log(JSON.parse(res))
            res = JSON.parse(res)
            if(res.result==100){
                let data = res.data
                $('.ic-pic').attr('src',data.erCodeImg)
                $('#copyVal').val(data.inviteToken)
                $('.inviteNumber').html(data.inviteCount)
                //分享时用的数据
                params={
                    pageUrl : data.pageUrl,
                    desc : data.desc,
                    icon :  data.icon,
                    title : data.title
                }
            }else{
                $.toast(res.message, "text");     //提示
            }
        },
    }

4.触发app端的事件,例如分享
1)页面中

 let wxShare=function(){  //微信分享
        // console.log('wx')
        let strParameter = JSON.stringify(params)
        app.wxShare(strParameter)    //全局中定义的方法名
    }

全局中分享的方法

 wxShare: function (strParameter) {  //微信分享
 //app端会拿到对应的方法,然后app端做处理
            if (isIOS) {
                window.webkit.messageHandlers.wxShare.postMessage(strParameter);
            } else if (isAndroid) {
                window.wxShare.OnClick(strParameter);
            }
        },
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值