前端菜菜一枚,写下关于h5 和native 交互那些事情。偏前端,各种理论知识,不在赘述。之前有各位大牛已经写过。我只写代码,有问题,下面留言

/* 关于h5 和native 之间的交互 JSBridge 解决问题,偏向前端* 使用URL 拦截方式,借用iframe *//*** ios,使用自有shouldStartLoadWithRequest 方法* 安卓:shouldOverrideUrlLoading* html5:挂载到window 对象上* */
html5部分:
dom:<button onclick="showLoading()"> showLoading</button><button onclick="closeLoading()"> closeLoading</button><button onclick="showAlert()">showAlert</button><button onclick="toast()">toast</button><button onclick="pending_payment()">pending_payment</button>script:var bridge = {'linkNative': function (func, type, params, callback) {var funcId = 'cb_' + +new Date()window[funcId] = callback || function () { }params = params || {}var req = {handler: func,params: params || undefined,callback: callback && funcId}var src = 'test://' + type + '?' + JSON.stringify(req)var frag = document.createElement('iframe')frag.style.display = 'none'frag.src = srcdocument.body.appendChild(frag);setTimeout(function () {document.body.removeChild(frag)}, 1000)},'showLoading': function () {this.linkNative('showLoading', 'functional')return this},'closeLoading': function () {this.linkNative('closeLoading', 'functional')return this},'showAlert': function (params) {this.linkNative('showAlert', 'functional', params)},'toast': function (params) {this.linkNative('toast', 'functional', params)return this},// 发起支付请求'pending_payment': function (params, callback) {this.linkNative('pending_payment', 'business', params, callback)}}//开启loadingfunction showLoading() {console.log('a')bridge.showLoading()}function closeLoading() {bridge.closeLoading()}function showAlert() {bridge.showAlert('我点击了showAlert')}function toast() {var params = {data: "我是toast"}bridge.toast(params)}function pending_payment() {var params = {orderId: '12uroi2u4oifjidsafj',time: '1234234392483294829',name: '张三'}bridge.pending_payment(params, function () {bridge.showAlert('支付的回调函数')//其他业务代码})}

这是在和native端约定好的协议和方法 test,functional,buness

参考:https://juejin.im/post/5bda6f276fb9a0226d18931f

安卓demo:
JSonUtils.java

package com.example.zhangyuke.mywebview;import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;import com.alibaba.fastjson.JSONObject;public class MainActivity extends AppCompatActivity {private static final String TAG = "MainActivity";private WebView wb;private String URL_HOST_STARTWITH_FUNCATIONAL = "test://functional";private String URL_HOST_STARTWITH_BUSINSS = "test://business";private String URL_QUERY_KEY_HANDLER = "handler";private String URL_SHOW_LOADING = "showLoading";private String URL_CLOSE_LOADING = "closeLoading";private String URL_SHOW_ALERT="showAlert";private String URL_TOAST="toast";private String URL_PENDING_PAYMENT="pending_payment";private String URL_QUERY_KEY_CALLBACK="callback";private String URL_QUERY_PARAMS="params";private String URL_DATA="data";private String ORDER_ID="orderId";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);wb = findViewById(R.id.wb);//支持js语言wb.getSettings().setJavaScriptEnabled(true);//缩放至屏幕的大小wb.getSettings().setLoadWithOverviewMode(true);//支持缩放wb.getSettings().setSupportZoom(true);//webview去加载网页wb.loadUrl("http://www.jiaxinying.cn./bridge/");//设置用自己的浏览器打开wb.setWebViewClient(new MyWebViewClient());}private boolean baseParseShouldOverrideUrlLoading(WebView view, String url, Uri uri) {if (url.startsWith(URL_HOST_STARTWITH_FUNCATIONAL)) {JSONObject queryObject = JSonUtils.parseObjectWithoutException(uri.getQuery());String jsCallback = queryObject.getString(URL_QUERY_KEY_CALLBACK);String action = queryObject.getString(URL_QUERY_KEY_HANDLER);Log.d(TAG, "test://functional: handler: " + action);if (URL_SHOW_LOADING.equals(action)) {Toast.makeText(this, "加载进度条", Toast.LENGTH_SHORT).show();return true;} else if (URL_CLOSE_LOADING.equals(action)) { // 设置标题Toast.makeText(this, "关闭进度条", Toast.LENGTH_SHORT).show();return true;}else if (URL_SHOW_ALERT.equals(action)){String params = queryObject.getString(URL_QUERY_PARAMS);if (!TextUtils.isEmpty(params)) {Toast.makeText(this, params, Toast.LENGTH_SHORT).show();}}else if (URL_TOAST.equals(action)){String params = queryObject.getString(URL_QUERY_PARAMS);if (!TextUtils.isEmpty(params)){JSONObject paramsObject=JSonUtils.parseObjectWithoutException(params);if (paramsObject!=null){String data = paramsObject.getString(URL_DATA);Toast.makeText(this, data, Toast.LENGTH_SHORT).show();}}}} else if (url.startsWith(URL_HOST_STARTWITH_BUSINSS)){JSONObject queryObject = JSonUtils.parseObjectWithoutException(uri.getQuery());String jsCallback = queryObject.getString(URL_QUERY_KEY_CALLBACK);String action = queryObject.getString(URL_QUERY_KEY_HANDLER);if (URL_PENDING_PAYMENT.equals(action)){String params = queryObject.getString(URL_QUERY_PARAMS);if (!TextUtils.isEmpty(params)){JSONObject paramsObject=JSonUtils.parseObjectWithoutException(params);if (paramsObject!=null){String order = paramsObject.getString(ORDER_ID);
//                        Toast.makeText(this, order, Toast.LENGTH_SHORT).show();}}callBackToJs(jsCallback,"");}}return false;}//js回调private void callBackToJs(String callbackFunc, String callbackParam) {if (TextUtils.isEmpty(callbackFunc)) {Log.e(TAG,"callback Func is Null");} else {wb.loadUrl("javascript:" + callbackFunc + "(" + callbackParam + ")");}}class MyWebViewClient extends WebViewClient {@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {Log.i(TAG,"webView shouldOverrideUrl: " + url);Uri uri = Uri.parse(url);return baseParseShouldOverrideUrlLoading(view, url, uri);}}}

MainActivity.java

package com.example.zhangyuke.mywebview;import android.util.Log;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;import java.text.DateFormat;
import java.util.logging.Logger;/*** Created by zhangyuke on 2018/11/6.*/public final class JSonUtils {private static final String TAG = JSonUtils.class.getSimpleName();private JSonUtils() {//Utility classes should not have a public or default constructor.}public static <T> T parseObjectWithoutException(String text, Class<T> clazz) {try {return JSON.parseObject(text, clazz);} catch (Exception ex) {Log.e(TAG, "parseObjectWithoutException, exception = " + ex.getMessage());return null;}}public static JSONObject parseObjectWithoutException(String text) {try {return JSON.parseObject(text);} catch (Exception ex) {Log.e(TAG, "parseObjectWithoutException, exception = " + ex.getMessage());return null;}}
}

最后,感谢我司阿珂。提供安卓demo文档。

h5 和native 交互那些事儿相关推荐

  1. Android内部h5和native交互实现方式

    Android具体实现方式 一.实现方式 a.h5调用native: Android实现h5到native的方式为截获h5调用的特定url,一般url都是http://**这种,为了能够捕获h5调用的 ...

  2. H5与Native交互之JSBridge技术

    一.原理篇 下面分别介绍IOS和Android与Javascript的底层交互原理 IOS 在讲解原理之前,首先来了解下iOS的UIWebView组件,先来看一下苹果官方的介绍: You can us ...

  3. 【quickhybrid】H5和Native交互原理

    前言 Hybrid架构的核心就是JSBridge交互,而实现这个交互的前提是弄清楚H5和Native端的交互 本文主要介绍Native端(Android/iOS)和H5端(泛指前端)的交互原理 (之前 ...

  4. H5与Native交互之JSBridge技术 1

    做过混合开发的很多人都知道Ionic和PhoneGap之类的框架,这些框架在web基础上包了一层Native,然后通过Bridge技术使得js可以调用视频.位置.音频等功能.本文就是介绍这层Bridg ...

  5. android与h5交互设计,H5与native交互之JSBridge

    JSBridge 1.  Why do we need JSBridge? 2.  Why is "JS"Bridge? 3.  What is JSBridge? Why do ...

  6. 移动端 h5和原生交互的方式

    一.h5传递给原生WebView的数据协议 传递的是个json字符串: {"id": "random_value","action": &q ...

  7. native html5 区别,H5与Native优劣对比

    即将启动爱奇艺商城(mall.iqiyi.com)移动端的native化. 项目开始之前当然要梳理下为什么做native,究竟H5跟native比有什么劣势,而H5又为什么占比那么高并且有" ...

  8. 【前端基础】Web与Native交互之The JSBridge FAQ

    今天我们来简单聊一下JSBridge 为什么要聊JSBridge? 不为什么 好吧,JSBridge虽然也算比较古老了,但关于JSBridge的原理也是一个目前作为一名前端开发人员需要了解掌握的知识. ...

  9. Android 和H5之间的交互-框架篇

    就目前而言,app的开发主要分三个方向:native app.hybrid app以及web app.个人感觉三种app的体验感是逐渐递减的. hybrid app和web app的开发的不同之处就是 ...

最新文章

  1. Case Study: 利用PHP获取关系型数据库中多张数据表的数据
  2. lower() oracle,PLSQL LOWER用法及代码示例
  3. Leetcode 260. 只出现一次的数字 III 解题思路及C++实现
  4. matlab文件读写监听,matlab对文件的读写
  5. windows下怎么安装protobuf for python
  6. 让IE的F1帮助变成自己的
  7. Tensorflow(一) 基础命令
  8. 2018年通信工程师中级传输与接入无线专业实务真题
  9. 计算机二级真题期刊论文模板,最新一般期刊论文格式
  10. 使用 PyQt5 和 Echarts 打造股票数据看板
  11. Qt::WA_DeleteOnClose介绍与注意事项
  12. Koo叔说Shader-调试Shader
  13. android 好友功能,ListView模拟微信好友功能
  14. 征途服务器维护时间,征途私服服务器维护是什么问题
  15. 使用 npm 打包项目
  16. java高并发唯一订单号_高并发下唯一订单号生成器--雪花算法
  17. Ubuntu18.04+GTX1060+显卡驱动+CUDA11.2+cuDNN8.1.1
  18. Xshell和Xftp使用(非商业用途可以免费使用啦)
  19. 【智能驾驶】最全、最强的无人驾驶技术学习路线
  20. SUSE12 LVM- Logical Volume Manager(逻辑卷管理)实例

热门文章

  1. 积少成多 Flash(ActionScript 3.0 Flex 3.0) 系列文章索引
  2. 网络框架 - 收藏集 - 掘金
  3. 代码解说Android Scroller、VelocityTracker
  4. “互联网+”的时代,易佳互联也随着时代步伐前进着
  5. 1.1GTK+ 的简单程序HelloWorld
  6. centos lustre 简单 安装教程
  7. 基础篇 第四节 项目进度计划编辑 之 任务关联性设定
  8. 面试准备--7.31
  9. html中连续点击某个标签会出现蓝色的解决方法
  10. 第3课:SparkStreaming 透彻理解三板斧之三:解密SparkStreaming运行机制和架构进阶之Job和容错...