场景1H5页面在原生应用中经常用到,比如电商中的活动页,一些电商中的详情页等...这些页面有一个特点,就是以后修改的可能性大,而且一次性的几率特别高。所以使用H5页面是最明智的选择。一旦用上H5,就少不了与原生开发(Android、IOS)的一些交互。以下解决方案可以帮助您解决它。实现原理是在js的window对象中原生注入一个js方法,以防原生应用触发惩罚,这和我们平时调用onclick的方法一样简单。js代码://mobile/index.js常用的js调用native方法都体现在这里。exportdefault{/***调用手机方法**@param{*}{name,params,call}手机注入的方法名|参数|callback*/callMoblieMethods({name,params,call}){//移动Android环境if(window.android){//移动端使用java所以不能直接解析json,只能解析字符串或者json字符串window.android[name](JSON.stringify(参数));}//移动IOS环境if(window.webkit&&window.webkit.messageHandlers){window.webkit.messageHandlers[name].postMessage(params);}}}调用方法if(window.android||(window.webkit&&window.webkit.messageHandlers.activityDetails)){mobile.callMoblieMethods({name:'activityDetails',params:{activityId:item.act_id}});}这个判断条件大家可能觉得比较陌生,我测试过各种机器的型号,Android机器窗口肯定是没有属性的,但是在IOS上,它会有自己的webkit属性,所以我们先判断它有没有webkitattributes,然后判断是否有注入的方法名,这样才能很好的调用这个方法;为了方便大家,这里也放上移动端的代码://AndroidpublicclassAndroidJavascriptInterface{ActivitymActivity;公共AndroidJavascriptInterface(活动活动){this.mActivity=活动;}//诊所详情@JavascriptInterfacepublicvoidclinicDetails(StringjsonData){Log.i("znh","H5-JS-诊所详情");意图intent=newIntent(mActivity,OutPatientActivity.class);捆绑捆绑=新捆绑();bundle.putString(Constants.CLINIC_ID,GsonUtil.getJSONObjectKeyVal(jsonData,"clinicId"));intent.putExtras(捆绑包);mActivity.startActivity(意图);}//活动详情@JavascriptInterfacepublicvoidactivityDetails(StringjsonData){Log.i("znh","H5-JS-活动详情");Intentintent=newIntent(mActivity,ActivityDetailActivity.class);捆绑捆绑=新捆绑();bundle.putString("id",GsonUtil.getJSONObjectKeyVal(jsonData,"activityId"));intent.putExtras(捆绑包);mActivity.startActivity(意图);}}//IOS#import
