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

这篇具有很好参考价值的文章主要介绍了移动端 h5和原生交互的方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、h5传递给原生WebView的数据协议

传递的是个json字符串:

{
    "id": "random_value",
    "action": "action_name",
    "callback": "function_name",  // optional
    "data": {...}  // optional
}

id:这次操作的id,回调时会再传回来。因为交互有可能是异步的,对同一个接口调用多次时,回调时以id来区分是哪一次。id由js自己定义保证唯一即可,简单的做法是使用Math.random()
action:操作名称,取名应该能反映其意义,例如getIp(获取ip地址)
callback:可选,操作完成后的js回调函数名。不用回调就不传此参数
data:可选,某些操作才需要。app会解析data中的数据使用。

例如:h5调用原生的网络请求可以这么定义

{
     "id":100,
     "action":"doRequest",
     "callback","onResponse"
     "data":{
         "method":"get",
         "url":"",
         "body":""
         "header":""
         "type":"noCache"
     }
}

二、原生WebView传递给h5的数据协议

原生WebView传给h5的也是个json字符串:

{
    "id": "random_value"
    "action": "action_name",
    "platform": "android"
    "data": {...}  
}


id:与传给WebView的一致。
action:与传给WebView的一致。如果各种操作都用同一个回调函数,则可以此区分是哪个操作。
platform:平台
data:操作结果对应的数据,是原生提供给h5的具体数据

三、h5通过js的调用方式

注入的对象在android是全局变量,也即是window的成员变量,android这边会提供一个统一的调用方法入口,叫postMessage,注入的对象名叫nativeCaller,调用方式如下:

function callNative(object) {
  if (window.nativeCaller) {
    window.nativeCaller.postMessage(JSON.stringify(object))
  } else {
    alert("此功能需要在原生WebView中使用!")
  }
}

四、Android端的处理方式

创建BaseJsHandler的子类,例如获取原生设备信息的处理

public class DeviceInfoHandler extends BaseJsHandler {

    @Override
    public String action() {
        return "getDeviceInfo"; //对应h5请求数据中action
    }
    //data是h5请求数据的data节点,callback是h5的回调函数方法名
    @Override
    protected JSONObject handleMessage(JSONObject data, String callback) {
        //这里返回的json数据最终会被包装到data节点内,该过程是框架完成的,无需关心.
        JSONObject toJson = new JSONObject();
        try {
            toJson.put("isWifi", NetworkUtils.isWifiAvailable());
            toJson.put("isNetworkAvailable", NetworkUtils.isNetworkAvailable());
            if (null != AppUtils.getPackageInfo()) {
                toJson.put("packageName", AppUtils.getPackageInfo().packageName);
                toJson.put("versionCode", AppUtils.getPackageInfo().versionCode);
                toJson.put("versionName", AppUtils.getPackageInfo().versionName);
                toJson.put("screenWidth", PixUtils.screenWidth());
                toJson.put("screenHeight", PixUtils.screenHeight());
                toJson.put("statusBarHeight", PixUtils.statusBarHeight());
                toJson.put("deviceId", AppUtils.getDevId());
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return toJson;
    }

}

  然后调用WebViewInject类的addHandler方法注入该处理类

WebViewInject.getInstance().addHandler("getDeviceInfo", DeviceInfoHandler.class)

五、app与内嵌h5网页(vue)交互(相互调用js)&&传值

如何传值?
例如:内嵌的h5发请求也token参数,怎么拿到token?

方法一:拼接法。最简单的,app链入h5地址时在后面拼接上所需的参数(token),可行但不够安全。

方法二:暴露法。也比较简单,就是ios开发和安卓开发将所需的值暴露在window,我们直接window.xxx既可以拿到。(这个比较简便,调用APP底座方法)

方法三:使用的是WebViewJavascriptBridge,转载参考https://blog.csdn.net/weixin_44696379/article/details/103327042

H5与原生app交互,需要WebViewJavascriptBridge,废话不多直接上代码,下面是项目中的封装bridge.js的全部代码(示例代码为vue)

//iOS 交互声明
function connectWebViewJavascriptBridgeIOS(callback) {
  if (window.WebViewJavascriptBridge) {
    return callback(window.WebViewJavascriptBridge)
  }
  if (window.WVJBCallbacks) {
    return window.WVJBCallbacks.push(callback)
  }
  window.WVJBCallbacks = [callback]
  let WVJBIframe = document.createElement('iframe')
  WVJBIframe.style.display = 'none'
  WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__'
  document.documentElement.appendChild(WVJBIframe)
  setTimeout(() => {
    document.documentElement.removeChild(WVJBIframe)
  }, 0)
}
 
 
//Android 交互声明
function connectWebViewJavascriptBridgeANDROID(callback) {
  if (window.WebViewJavascriptBridge) {
    callback(WebViewJavascriptBridge);
  } else {
    document.addEventListener(
      "WebViewJavascriptBridgeReady",
      function () {
        callback(WebViewJavascriptBridge);
      },
      false
    );
  }
}
 
export default {
  //H5调用Native
  callhandler(name, data, callback) {
    //iOS的方法
    if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {
      connectWebViewJavascriptBridgeIOS(function (bridge) {
        bridge.callHandler(name, data, callback)
      })
    }
    //Android方法
    if (/(Android)/i.test(navigator.userAgent)) {
      connectWebViewJavascriptBridgeANDROID(function (bridge) {
        bridge.callHandler(name, data, callback)
      })
    }
  },
  //Native调用H5
  registerhandler(name, callback) {
    //iOS的方法
    if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {
      connectWebViewJavascriptBridgeIOS(function (bridge) {
        bridge.registerHandler(name, function (data, responseCallback) {
          callback(data, responseCallback)
        })
      })
    }
    //Android方法
    if (/(Android)/i.test(navigator.userAgent)) {
      connectWebViewJavascriptBridgeANDROID(function (bridge) {
        bridge.init(function (message, responseCallback) {
          if (responseCallback) {
            // responseCallback(data);
          }
        });
        bridge.registerHandler(name, function (data, responseCallback) {
          callback(data, responseCallback)
        })
      })
    }
  },
}

然后挂载到vue的原型方法上,在main.js中进行如下配置

import Bridge from "@/config/bridge.js" //此路径根据实际bridge.js路径填写
Vue.prototype.$bridge = Bridge

完事儿,下面看一下在实际使用中的用法啊文章来源地址https://www.toymoban.com/news/detail-822377.html

methods: {
    // h5调用原生方法,testWebViewBridge为原生app定义的方法名。action为h5传递给原生app的参数,可以为多个。data为原生app传递给h5参数
    goNative() {
      const vm = this;
      this.$bridge.callhandler(
        "testWebViewBridge",
        { action: "pick me" },
        data => {
          vm.ddd = data;
 
          // 处理返回数据
        }
      );
    },
    // h5注册方法,供app调用
    iosToH5(){
      
    },
  },
 
  mounted() {
    // 原生app调用h5方法,iosToH5是methods中定义的方法名。
    const vm = this;
    this.$bridge.registerhandler("iosToH5", (data, responseCallback) => {
      // data是原生app传递给h5的参数
      vm.native_data = data;
    });
  }

到了这里,关于移动端 h5和原生交互的方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • App与H5交互的几种方式

    1、直接调用App的定义的方法 首先我们需要判断当前App的客户端是Ios还是Android,针对不同的客户端我们需要调用不同的方法。 2、调用方法获取数据 这种方法和第一种方法一致,只不过是Ios与Android返回的值不同。 3、暴露方法给App调用传值 在很多时候并不一定是H5去调用App,

    2024年02月11日
    浏览(35)
  • Vue.js uni-app 混合模式原生App webview与H5的交互

    在现代移动应用开发中,原生App与H5页面之间的交互已经成为一个常见的需求。本文将介绍如何在Vue.js框架中实现原生App与H5页面之间的数据传递和方法调用。我们将通过一个简单的示例来展示如何实现这一功能。 效果图如下: 首先,我们需要在Vue.js项目中引入原生App与H5页面

    2024年02月16日
    浏览(45)
  • h5页面如何与原生交互

    本文讲述h5页面跟原生通信,比如在app内,调用相机,获取相册内的图片,在app内拉起微信小程序等等,h5页面没有这么多权限能够直接调用移动端的原生能力,这个时候就需要与原生进行通讯,传递一个信号给原生这边,然后原生直接调用手机端的能力。 下面分别讲解h5与

    2024年02月16日
    浏览(31)
  • uniapp开发安卓App注意事项(HTML5+规范 plus调用安卓原生能力:广播,扫描,相机等)

    使用安卓调试基座进行调试大大降低了uniapp开发安卓app的门槛 安卓开发经常需要调用到安卓原生的api,例如广播,扫码,相机等等,uniapp内置了App端的HTML5+规范,可以使用js直接调用丰富的原生能力。例如在安卓中调用原生的激光扫描能力: 该plus对象便是uniapp内置的HTML5+规

    2024年03月19日
    浏览(38)
  • HTML5(H5)的前生今世

    HTML5是一种用于构建和呈现网页的最新标准。它是HTML(超文本标记语言)的第五个版本,于2014年由万维网联盟(W3C)正式推出。HTML5的前身可以追溯到互联网爆发的早期,当时网页设计师们面临着许多限制和挑战。 在互联网的早期阶段,网页的设计和构建主要依赖于HTML和C

    2024年02月14日
    浏览(28)
  • h5(html5)+css3前端笔记二

    一、表格标签 表格的主要作用: 表格主要用于 显示、展示数据 ,因为它可以让数据显示的非常的规整,可读性非常好。特别是后台展示数据的时候,能够熟练运用表格就显得很重要。一个清爽简约的表格能够把繁杂的数据表现得很有条理。 1. table/table 用来定义表格的标签

    2024年02月14日
    浏览(49)
  • Html5版音乐游戏制作及分享(H5音乐游戏)

    这里实现了Html5版的音乐游戏的核心玩法。 游戏的制作借鉴了,很多经典的音乐游戏玩法,通过简单的代码将音乐的节奏与操作相结合。 可以通过手机进行游戏,准确点击下落时的目标,进行得分。 点击试玩 游戏内的下落数据是通过手打记录的,可能有些偏差哈。 1、Html中

    2023年04月17日
    浏览(28)
  • Android与H5交互 -- 点击H5跳转到 Android原生 页面 ,webview与h5(js)交互

    Android与H5交互 app开发过程中,利用原生+h5模式来开发是比较常见的 下面案例演示的是:原生调起一个H5页面,然后H5点击跳转到原生 WebViewActivity页面 调用H5 ,点击H5链接 跳转到原生MainActivity页面 注意 别忘了 !-- 添加网络权限 -- 一、清单文件,增加的配置 data的数据就是H5

    2023年04月14日
    浏览(50)
  • HTML5:构建现代、交互式的Web应用

    HTML5作为最新版本的HTML标准,引入了许多令人兴奋的特性和改进,使Web开发更加灵活和强大。本篇博客将围绕HTML5的核心功能展开,包括语义化标签、多媒体支持、表单增强、Canvas绘图、地理定位、本地存储等方面。我们将通过详细的代码示例和实用的技巧,帮助你全面掌握

    2024年02月12日
    浏览(32)
  • VUE html5-qrcode H5扫一扫功能

    官方文档  html5-qrcode 安装   npm i html5-qrcode 1、新建一个组件  2、引入 3、获取摄像权限在created调用 4、获取扫码内容 5、必须在销毁页面前关闭扫码功能否则会报错   could not start video source 6、在扫码页面引用组件 组件完整代码 引用组件页面

    2024年02月16日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包