小组中提出要在移动端放入h5页面当做活动页,这就难免不得与移动端进行数据交互

其实方法很简单,但是对于第一次接触的小伙伴来说,确实不能很快理解,只有自主写出来之后,有一种“不过如此”的感觉

废话少说,上代码

重点写在前面  在调用各端的方法时,方法名一定要一致

比如移动端调用H5方法,H5挂载在window上的方法名要与移动端请求的方法名一致

H5调移动端也一样

首先是先判断h5在哪个端打开

我这里写的多了,仅供参考

const u = navigator.userAgent;
const ios = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
const iPad = u.indexOf('iPad') > -1;
const iPhone = u.indexOf('iPhone') > -1 || u.indexOf('Mac') > -1;
const android = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1;
if (ios || iPad || iPhone) {
    //  写与iOS交互的代码
}
else if (android) {
    //  写与安卓交互的代码
}

移动端调H5方法   H5该如何写

首先在methods中写方法,然后挂载在window上

onLoad{
    const u = navigator.userAgent;
    const ios = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
    const iPad = u.indexOf('iPad') > -1;
    const iPhone = u.indexOf('iPhone') > -1 || u.indexOf('Mac') > -1;
    const android = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1;
    if (ios || iPad || iPhone) {
        //  写与iOS交互的代码
        window.mobilePatriarchActDetails = this.mobilePatriarchActDetails;
	    window.mobileMuteBgMusic = this.mobileMuteBgMusic;
    }
    else if (android) {
        //  写与安卓交互的代码
        window.mobilePatriarchActDetails = this.mobilePatriarchActDetails;
	    window.mobileMuteBgMusic = this.mobileMuteBgMusic;
    }
}


methods: {
    //移动端无返回参数的情况 (这是移动端app放入后台后,背景音乐还会播放,通过调这个方法来暂停,可以看我上一个文章)
    mobileMuteBgMusic() {
	    this.muteBgMusic = true;
    },
    //移动端返回参数的情况
    mobilePatriarchActDetails(parmas) {
        //parmas就是移动端调H5后 返回给我的数据
       //要在这里进行数据处理  比如存到vuex 或 数据当作请求参数给后端时,要在这里拿到数据后就调用请求后端的方法
	    console.log(parmas)
    },
}

H5调用移动端

由于安卓是把方法写在actDetailsInterface 这个类中,所以我直接接收这个类,也就是对象

ios则是需要单独写,单个挂载传递给我,为了统一性,接收ios方法时,我也写在了Mobilemethods里面

onLoad{
    const u = navigator.userAgent;
    const ios = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
    const iPad = u.indexOf('iPad') > -1;
    const iPhone = u.indexOf('iPhone') > -1 || u.indexOf('Mac') > -1;
    const android = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1;
    if (ios || iPad || iPhone) {
        //  写与iOS交互的代码
        window.mobilePatriarchActDetails = this.mobilePatriarchActDetails;
	    window.mobileMuteBgMusic = this.mobileMuteBgMusic;

        // 接收ios方法
        this.Mobilemethods = {
				backActivity: () => {
                    //如果ios端不需要参数,但也需要传参,可以为null,或者协商好后随便传一个,否则会报错
					window.webkit.messageHandlers.backActivity.postMessage(null);
				},
				observe: id => {
					window.webkit.messageHandlers.observe.postMessage(id);
				},
			};
    }
    else if (android) {
        //  写与安卓交互的代码
        window.mobilePatriarchActDetails = this.mobilePatriarchActDetails;
	    window.mobileMuteBgMusic = this.mobileMuteBgMusic;

        // 接收安卓方法
        this.Mobilemethods = window.actDetailsInterface;
    }
}


methods: {
    //移动端无返回参数的情况 (这是移动端app放入后台后,背景音乐还会播放,通过调这个方法来暂停,可以看我上一个文章)
    mobileMuteBgMusic() {
	    this.muteBgMusic = true;
    },
    //移动端返回参数的情况
    mobilePatriarchActDetails(parmas) {
        //parmas就是移动端调H5后 返回给我的数据
       //要在这里进行数据处理  比如存到vuex 或 数据当作请求参数给后端时,要在这里拿到数据后就调用请求后端的方法
	    console.log(parmas)
    },


   //使用移动端方法
	goBack() {
		let goBackActivity = this.Mobilemethods.backActivity();
		goBackActivity();
	},
	toObs(id) {
		let goObserve = this.Mobilemethods.observe(id);
		goObserve(id);
	},
}

前端要写的东西就这么多了

接下来是安卓端的代码(当时安卓端写了一个包,方便我进行调试)

安卓调用H5

@Override
public void onPageFinished(WebView view, String url) {//页面加载完成
    super.onPageFinished(view, url);
    Log.e(TAG, "页面加载完成:" + url);
    mWebViewBanner.loadUrl("javascript:mobilePatriarchActDetails('" + studentId + "," + activityId + "," + studyDate + "," + token + "')");
}

H5调用安卓

public class ActDetailsInterface {

    public String TAG = "ActDetailsInterface";

    public Context context;

    public ActDetailsInterface(Context context) {
        this.context = context;
    }

    @JavascriptInterface
    public void observe(String obsId) {
        Log.e(TAG, "观察记录 -> " + obsId);
    }


    @JavascriptInterface
    public void backActivity(){
        Log.e(TAG, "原生页面返回");
    }

}

————end