js和原生应用经常使用的数据交互方式

场景1

在原生app中常常会使用到H5页面,好比说电商中的活动页,一些电商中的详情页,等等...这些页面都有一个特色,那就是在将来修改的可能性,和一次性的概率特别的大。因此用H5的页面是最睿智的一种选择。
一旦使用了H5那么就少不了和原生开发的一些交互(Android, IOS)以下的方案可以帮助你解决。 其实现原理是原生在js的window对象中注入一个js方法,以备原生应用进行处罚触发,就和咱们平时去调用onclick的方法同样简单。 js代码:前端

// mobile/index.js 经常使用js 调用原生的方式都在这里体现。
export default {
    /**
     * 调用移动端方法
     *
     * @param {*} {name, params, call} 移动端注入的方法名 | 参数 | 回调
     */
    callMoblieMethods({name, params, call}){
        // 移动端安卓的环境
        if(window.android) {
            // 移动端使用java因此不能直接解析json,只能解析字符串或者json字符串
            window.android[name](JSON.stringify(params));  
        }
        // 移动端IOS的环境
        if(window.webkit && window.webkit.messageHandlers) {
            window.webkit.messageHandlers[name].postMessage(params);
        }
    }
}
复制代码

调用方式java

if(window.android || (window.webkit && window.webkit.messageHandlers.activityDetails)) {
    mobile.callMoblieMethods({ name: 'activityDetails', params: {activityId: item.act_id}});
}
复制代码

这个判断条件你们看起来可能很诡异,我测试过这各类机器的机型,安卓机window确定是没有的属性,可是在IOS上他会自带webkit属性因此咱们先判断他是否有webkit属性在判断他是否有注入的方法名这样他就能很好的调用这个方法了;android

为了方便你们查找这里也附上移动端的代码:程序员

//Android

public class AndroidJavascriptInterface {

  Activity mActivity;

  public AndroidJavascriptInterface(Activity activity) {
      this.mActivity = activity;
  }

  //诊所详情
  @JavascriptInterface
  public void clinicDetails(String jsonData) {
      Log.i("znh", "H5-JS-诊所详情");
      Intent intent = new Intent(mActivity, OutPatientActivity.class);
      Bundle bundle = new Bundle();
      bundle.putString(Constants.CLINIC_ID, GsonUtil.getJSONObjectKeyVal(jsonData, "clinicId"));
      intent.putExtras(bundle);
      mActivity.startActivity(intent);
  }

  //活动详情
  @JavascriptInterface
  public void activityDetails(String jsonData) {
      Log.i("znh", "H5-JS-活动详情");
      Intent intent = new Intent(mActivity, ActivityDetailActivity.class);
      Bundle bundle = new Bundle();
      bundle.putString("id", GsonUtil.getJSONObjectKeyVal(jsonData, "activityId"));
      intent.putExtras(bundle);
      mActivity.startActivity(intent);
  }
}


//IOS
#import <JavaScriptCore/JavaScriptCore.h>

WKWebViewConfiguration *wkWebConfig = [[WKWebViewConfiguration alloc] init];
[wkWebConfig.userContentController addScriptMessageHandler:self name:@"clinicDetails"];
[wkWebConfig.userContentController addScriptMessageHandler:self name:@"activityDetails"];
复制代码

经过这个流程你们就能很方便的调用原生的方法了。web

场景2

咱们须要在短信中使用某个连接去打开原生应用若是没有那么就会提示他去下载某个应用,首先原生的应用须要定义一个url连接以备前端程序员在浏览器中调用,先给你们看一下连接示例:json

// IOS
iOSStarClinic://

// Andriod 
yjjkyl://starclinic

复制代码

短小精悍,你只须要调用这个就能够了浏览器

那么在js中要怎么作呢?bash

if(this.isIOS) {
    window.location.href = 'iOSStarClinic://';//与APP约定的一个协议URL
} else {
    var state = null;
    try {
        state = window.open('yjjkyl://starclinic', '_blank');//与APP约定的一个协议URL
    } catch(e) {}
    if (state) {
        window.close();
    } else {
        window.location.href = gbs.patientDownUrl;
    }
}
复制代码

先判断一下当前是IOS仍是安卓环境,其实如今的浏览器已经不能经过偏方(计时的方法)来解决检查当前时候有没有安装应用了,由于浏览器会弹出提示框用户确认才能跳转因此用户一旦不点击确认那么浏览器就会进行跳转!因此在当前页应该要给用户显示一些内容以便用户未打开应用的时候有其余的业务流程。app

-完-post

相关文章
相关标签/搜索