h5和app原生通信的方法,什么是jsBridge,jsBridge 原理和步骤

2024-02-29 04:28

本文主要是介绍h5和app原生通信的方法,什么是jsBridge,jsBridge 原理和步骤,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

H5 和 App 原生应用之间通信的方法

  1. url scheme
  2. jsBridge
    1. 也就是 javascript interface
    2. 原生应用通过注入 JavaScript 接口到 WebView 中,让 H5 页面可以调用原生方法,从而实现双向通信【本质还是利用了 android webview 提供了注入的方法】
  3. WebSocket
  4. Hybrid 框架的通信机制
  5. LocalStorage 或者 IndexedDB

什么是jsBridge

JSBridge 是一种机制,用于在 WebView 中的 JavaScript 和原生应用之间进行通信。它允许 JavaScript 代码调用原生应用的方法,并且允许原生应用调用 JavaScript 中的方法,实现了两者之间的双向通信。

jsBridge实现的详细步骤:

  1. 原生应用给webview注册接口:原生应用在加载 WebView 时,会提供一些接口供 JavaScript 调用。

    1. 调用 andorid webview 提供的原生方法,webview.addJavascriptInterface 给 webview注册一个接口,名字叫 NativeInterface【可以自定义这个名字,和前端对好就行】

    2. addJavascriptInterface 有两个参数

      1. Object obj:要添加的Java对象,它可以是Java代码中的任何对象(如活动,服务等)。

      2. String interfaceName:该Java对象在JavaScript代码中使用的名称【我们这里叫NativeInterface】【可以自定义这个名字,和前端对好就行】。

      3. NativeInterface 会被挂载到 js 的全局作用域,webview中前端可以使用 window.NativeInterface 访问

    3. // 注册 JSBridge 接口,命名为 NativeInterface
      // AndroidNativeInterface 这个也要自己定义
      // AndroidNativeInterface里面通常有一个 方法,供js调用
      webView.addJavascriptInterface(new AndroidNativeInterface(), "NativeInterface");class AndroidNativeInterface {// 接收来自 H5 页面的消息,并在原生应用中处理@JavascriptInterfacepublic void handleMessage(String message) {// 处理来自 H5 页面的消息// 这里可以执行一些原生操作,或者将数据传递给其他组件// 为了简单起见,我们只是打印接收到的消息System.out.println("Received message from H5: " + message);// 在这里可以执行一些原生操作,例如弹出一个 Toast// Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();// 接收到消息后,可以调用 H5 页面中定义的接口来传递数据给 H5 页面// webView.evaluateJavascript("JSBridge.receiveMessageFromNative('" + message + "')", null);}}
  2. Javascript 封装 jsBridge对象

    1. 通常是包括【给原生应用发送消息】和【接收原生应用发来的消息】

    2. var JSBridge = {// 调用原生应用的方法,参数为要传递给原生方法的数据callNativeMethod: function(data) {// 调用原生方法,并传递数据window.NativeInterface.handleMessage(data);},// 接收原生应用传递的数据,并处理receiveMessageFromNative: function(data) {// 处理接收到的数据onsole.log("Received data from native: " + data);}
      };
    3. 【原生应用】可以调用下面的 JSBridge.receiveMessageFromNative 给 webview 传递数据,具体语法如下

    4. webView.evaluateJavascript("JSBridge.receiveMessageFromNative('" + message + "')", null);
    5. webView.evaluateJavascript 也是 andorid webview 提供的原生方法,参数是我们 js 里面声明的 JSBridge 全局对象【JSBridge这个名字可以自定义,但是原生应用和 js 要统一】

  3. js 给【原生应用】发送消息

    1. 调用完这一句,就是调用原生应用的 handleMessage,handleMessage里面有响应方法
    2. //给原生应用发送消息, 传递对象数据 {name: 'test'}
      JSBridge.callNativeMethod({name: 'test'})
  4. 原生应用 给 js 发送消息

    1. 就是在 handleMessage 里面的这条语句, JSBridge.receiveMessageFromNative 给webview传递数据

    2. webView.evaluateJavascript("JSBridge.receiveMessageFromNative('" + message + "')", null);

完整代码如下,由chatgpt生成

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>JSBridge Demo</title><script>// 定义 JSBridge 对象,用于与原生应用通信var JSBridge = {// 调用原生应用的方法,参数为要传递给原生方法的数据callNativeMethod: function(data) {// 调用原生方法,并传递数据window.NativeInterface.handleMessage(data);},// 接收原生应用传递的数据,并处理receiveMessageFromNative: function(data) {// 处理接收到的数据console.log("Received data from native: " + data);}};</script>
</head>
<body><button onclick="JSBridge.callNativeMethod('Hello from H5!')">Call Native Method</button>
</body>
</html>
import android.os.Bundle;
import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);WebView webView = findViewById(R.id.webview);webView.setWebViewClient(new WebViewClient());webView.setWebChromeClient(new WebChromeClient());webView.getSettings().setJavaScriptEnabled(true);// 注册 JSBridge 接口,命名为 AndroidNativeInterfacewebView.addJavascriptInterface(new AndroidNativeInterface(), "NativeInterface");// 加载 H5 页面webView.loadUrl("file:///android_asset/index.html");}// 自定义的 Android 原生接口class AndroidNativeInterface {// 接收来自 H5 页面的消息,并在原生应用中处理@JavascriptInterfacepublic void handleMessage(String message) {// 处理来自 H5 页面的消息// 这里可以执行一些原生操作,或者将数据传递给其他组件// 为了简单起见,我们只是打印接收到的消息System.out.println("Received message from H5: " + message);// 在这里可以执行一些原生操作,例如弹出一个 Toast// Toast.makeText(MainActivity.this, message, Toast.LENGTH_SHORT).show();// 接收到消息后,可以调用 H5 页面中定义的接口来传递数据给 H5 页面// webView.evaluateJavascript("JSBridge.receiveMessageFromNative('" + message + "')", null);}}
}

这篇关于h5和app原生通信的方法,什么是jsBridge,jsBridge 原理和步骤的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/757573

相关文章

使用Python和PaddleOCR实现图文识别的代码和步骤

《使用Python和PaddleOCR实现图文识别的代码和步骤》在当今数字化时代,图文识别技术的应用越来越广泛,如文档数字化、信息提取等,PaddleOCR是百度开源的一款强大的OCR工具包,它集成了... 目录一、引言二、环境准备2.1 安装 python2.2 安装 PaddlePaddle2.3 安装

spring IOC的理解之原理和实现过程

《springIOC的理解之原理和实现过程》:本文主要介绍springIOC的理解之原理和实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、IoC 核心概念二、核心原理1. 容器架构2. 核心组件3. 工作流程三、关键实现机制1. Bean生命周期2.

Redis实现分布式锁全解析之从原理到实践过程

《Redis实现分布式锁全解析之从原理到实践过程》:本文主要介绍Redis实现分布式锁全解析之从原理到实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、背景介绍二、解决方案(一)使用 SETNX 命令(二)设置锁的过期时间(三)解决锁的误删问题(四)Re

nginx负载均衡及详细配置方法

《nginx负载均衡及详细配置方法》Nginx作为一种高效的Web服务器和反向代理服务器,广泛应用于网站的负载均衡中,:本文主要介绍nginx负载均衡及详细配置,需要的朋友可以参考下... 目录一、 nginx负载均衡策略1.1 基本负载均衡策略1.2 第三方策略1.3 策略对比二、 nginx配置2.1

Java调用Python的四种方法小结

《Java调用Python的四种方法小结》在现代开发中,结合不同编程语言的优势往往能达到事半功倍的效果,本文将详细介绍四种在Java中调用Python的方法,并推荐一种最常用且实用的方法,希望对大家有... 目录一、在Java类中直接执行python语句二、在Java中直接调用Python脚本三、使用Run

Android 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja

Flutter实现文字镂空效果的详细步骤

《Flutter实现文字镂空效果的详细步骤》:本文主要介绍如何使用Flutter实现文字镂空效果,包括创建基础应用结构、实现自定义绘制器、构建UI界面以及实现颜色选择按钮等步骤,并详细解析了混合模... 目录引言实现原理开始实现步骤1:创建基础应用结构步骤2:创建主屏幕步骤3:实现自定义绘制器步骤4:构建U

在.NET平台使用C#为PDF添加各种类型的表单域的方法

《在.NET平台使用C#为PDF添加各种类型的表单域的方法》在日常办公系统开发中,涉及PDF处理相关的开发时,生成可填写的PDF表单是一种常见需求,与静态PDF不同,带有**表单域的文档支持用户直接在... 目录引言使用 PdfTextBoxField 添加文本输入域使用 PdfComboBoxField

SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法

《SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法》在SQLyog中执行存储过程时出现的前置缩进问题,实际上反映了SQLyog对SQL语句解析的一个特殊行为,本文给大家介绍了详... 目录问题根源正确写法示例永久解决方案为什么命令行不受影响?最佳实践建议问题根源SQLyog的语句分

redis中使用lua脚本的原理与基本使用详解

《redis中使用lua脚本的原理与基本使用详解》在Redis中使用Lua脚本可以实现原子性操作、减少网络开销以及提高执行效率,下面小编就来和大家详细介绍一下在redis中使用lua脚本的原理... 目录Redis 执行 Lua 脚本的原理基本使用方法使用EVAL命令执行 Lua 脚本使用EVALSHA命令