AI问答:JSBridge / WebView 与 Native 通信

简介: AI问答:JSBridge / WebView 与 Native 通信

一、理解JSBridge


6eed9b8ce5c2a677f2df36fb1d232a96_4705db10916b4fdefbe68501ac603dba.png


JSBridge是一种连接JavaScript和Native代码的桥梁,它提供了一种方法,使得JavaScript可以直接调用Native的代码,同时使得Native的代码也能直接调用JavaScript的方法,从而实现了JavaScript和Native之间的相互调用和传递数据。JSBridge通常用于Hybrid应用,如基于WebView的应用。


JSBridge是一个提供浏览器和原生应用交互的框架,它主要用于Web技术与Native技术的交互。Web技术通过WebView嵌入原生应用,Native技术通过JSBridge提供接口供Web技术调用,两种技术之间通过JSBridge实现快速高效、跨平台的数据传递和功能调用。具体来讲,Web技术通过JS调用JSBridge提供的API来调用原生应用的功能,而原生应用通过JSBridge提供的回调函数来响应Web技术的请求并返回数据。JSBridge实现了Web技术与Native技术的无缝连接,大大提高了应用的用户体验和交互性。同时,JSBridge的设计也非常灵活,可以根据实际需求进行扩展和定制化,是Web技术与原生应用协同开发的重要工具之一。


二、JSBridge都有哪些方法


JSBridge的具体方法取决于不同的框架和应用场景,以下是一些常见的JSBridge方法:


1、registerHandler(handlerName, handlerFunction):注册原生应用的接口,handlerName是接口名称,callback是回调函数。


2、callHandler(handlerName, data, responseCallback):JS调用原生应用的接口,handlerName是接口名称,data是传递给原生应用的数据,callback是回调函数。


3、removeHandler(handlerName):删除原生应用的接口,handlerName是接口名称。


4、unregisterHandler(handlerName):注销一个已经注册的JS调用Native的方法。


5、on(eventName, listener):监听Native传递给JavaScript的事件。


6、off(eventName, listener):取消监听Native传递给JavaScript的事件。


7、publish(eventName, eventData):向Native发布一个事件。


8、subscribe(eventName, listener):订阅Native发布的事件。


9、unsubscribe(eventName, listener):取消订阅Native发布的事件。


10、hasNativeMethod(handlerName, callback):检查原生应用是否支持指定的接口,handlerName是接口名称,callback是回调函数。


11、disableJavscriptAlertBoxSafetyTimeout():取消JS的安全时间限制,防止调用JS时出现卡顿。


12、setNativeLogEnable(isEnable):设置原生应用的日志输出是否可用,isEnable为true表示可用,为false表示不可用。


13、setDefaultHandler(handler): 设置默认的Native方法回调函数。


14、send(data, responseCallback): 向Native发送消息,data为传给Native的数据,responseCallback为回调函数。


三、JSBridge的原理和实现方式


这些方法的具体实现和调用方式可能因不同的JSBridge框架而异,但概念和逻辑大体一致。


JSBridge是一种通信桥梁,在Webview和Native之间起到了传递数据、调用方法的作用。JSBridge的原理主要是在Native侧暴露一些能力接口给JS调用,并在JS侧定义一些回调方法供Native调用。JS通过调用Native提供的接口来实现Native的能力,同时Native也能够调用JS定义的回调方法来实现某些功能。


在实现方面,JSBridge主要分为以下两种方式:


1、Native提供一个JavaScript接口,通过WebView的loadUrl方法将JavaScript代码注入到页面中,然后在页面中通过JavaScript调用Native提供的接口。Native再通过WebView的loadUrl方法执行JavaScript代码来回调JS的方法。


2、使用WebView的addJavascriptInterface方法,将Native提供的接口注入到JavaScript环境中。然后在JavaScript中直接调用Native的接口来实现通信。在Native侧,通过实现接口中的方法来响应JavaScript的调用。


需要注意的是,在使用JSBridge时,为了避免安全问题,需要谨慎处理JS注入和接口暴露的过程,并对接口、参数和回调进行严格的校验和过滤。


四、理解WebView


WebView 是 Native 平台上的一个控件,可以用来在应用程序中展示网页内容。WebView将网页的HTML、CSS和JavaScript等内容解析后,可以在应用程序中展示网页,还可以通过JavaScript与页面进行交互。


WebView的使用场景包括:


1、展示HTML内容:可以将应用程序中的一些介绍文档或者其他说明信息以HTML的方式展示给用户。


2、加载外部网页:应用程序可以通过WebView加载外部网页,方便用户在应用程序中访问网页。


3、实现Hybrid App:将WebView和JavaScript结合使用,可以实现Hybrid App,即原生应用与Web应用混合的应用程序。


使用WebView时需要注意以下几点:


1、WebView会占用一定的内存:特别是在加载大型网页时,会占用较多内存,容易导致应用程序崩溃。


2、WebView的渲染速度比较慢:特别是在加载复杂网页时,渲染速度会更慢,如果不合理使用加载网页的方式,会给用户带来不好的体验。


3、安全性问题:因为WebView基于系统内核进行渲染,所以存在某些安全漏洞,需要注意保证WebView的安全性。


五、JSBridge DEMO


5.1、创建一个网页,包含一个按钮并引入以下JS代码

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>JSBridge Demo</title>
  <script>
    function invokeNative(){
      if(window.WebViewJavascriptBridge){
        WebViewJavascriptBridge.callHandler('showNativeMessage', {'message': 'Hello, Native!'}, function(responseData){
          alert(responseData);
        });
      }else{
        alert('JSBridge is not ready');
      }
    }
  </script>
</head>
<body>
  <h1>JSBridge Demo</h1>
  <button onclick="invokeNative()">Click me to invoke native function</button>
</body>
</html>


5.2、在原生代码中创建一个 WebView 并注入 JavaScriptInterface 来创建一个 JSBridge

public class MainActivity extends AppCompatActivity {
    private WebView webView;
    private WebViewJavascriptBridge bridge;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webView = findViewById(R.id.web_view);
        webView.setWebChromeClient(new WebChromeClient());
        webView.setWebViewClient(new WebViewClient());
        webView.getSettings().setJavaScriptEnabled(true);
        webView.loadUrl("file:///android_asset/demo.html");
        WebView.setWebContentsDebuggingEnabled(true);
        WebViewJavascriptBridge.enableLogging();
        bridge = new WebViewJavascriptBridge(webView);
        bridge.registerHandler("showNativeMessage", new BridgeHandler() {
            @Override
            public void handler(String data, CallBackFunction function) {
                Toast.makeText(MainActivity.this, "Received message from web: " + data, Toast.LENGTH_SHORT).show();
                function.onCallBack("Hello, Web!");
            }
        });
    }
}


5.3、理解代码

Native 和 JS 双方都可以通过 registerHandler() 和 callHandler() 方法来注册和调用对方的方法。

其中,registerHandler() 用于注册 Native 方法,callHandler() 用于调用 JS 方法。

在调用 JS 方法时,可以传递参数和回调函数,在回调函数中可以获取 JS 方法的返回值。

本例中,当用户点击按钮时,JS 调用 Native 的 showNativeMessage() 方法,并传递一个包含一条消息的对象。

Native 在收到消息后,弹出一个 Toast,并返回一条消息给 JS。JS 接收到消息后,弹出一个对话框显示收到的消息。

以上就是一个简单的 JSBridge DEMO,它演示了如何在 Native 和 JS 之间进行通信,同时也展示了 JSBridge 的基本用法。


六、欢迎交流指正


参考链接

彻底理解JSBridge(彻底理解js中的闭包)

简易理解JSBridge实现原理 - 简书

深入浅出JSBridge:从原理到使用 - 知乎

JSBridge的原理及使用_Flying0901的博客-CSDN博客_jsbridge


相关文章
|
3月前
|
人工智能 JavaScript API
【HarmonyOS NEXT+AI】问答03:找不到DevEco Studio Cangjie Plugin下载链接?
本文针对学员在“HarmonyOS NEXT+AI大模型打造智能助手APP(仓颉版)”课程中提出的问题进行解答:为何无法在华为开发者社区官网找到DevEco Studio Cangjie Plugin下载链接。文中详细介绍了Cangjie Plugin的功能及获取方式,包括STS和Canary版本的申请流程,并提供了学习仓颉编程语言的资源与建议。对于普通开发者,STS版本是当前首选;同时,通过课程与官方教程,可快速掌握仓颉语言核心语法及API,助力开发HarmonyOS NEXT AI智能助手应用。
156 3
【HarmonyOS NEXT+AI】问答03:找不到DevEco Studio Cangjie Plugin下载链接?
|
4月前
|
存储 人工智能 前端开发
vue3.5接入deepseek-v3网页版ai流式多轮聊天问答助手
vue3-deepseek-webai:原创新作vite6+vue3.5+deepseek-v3+arco-design实战一款高颜值网页版ai多轮输出对话小助手。
520 14
|
14天前
|
数据采集 存储 人工智能
智能体(AI Agent)开发实战之【LangChain】(二)结合大模型基于RAG实现本地知识库问答
智能体(AI Agent)开发实战之【LangChain】(二)结合大模型基于RAG实现本地知识库问答
|
2月前
|
人工智能 JavaScript 安全
【HarmonyOS NEXT+AI】问答05:ArkTS和仓颉编程语言怎么选?
本文针对学员关于“鸿蒙主推开发语言是ArkTS,为何课程使用仓颉语言”的疑问进行解答。文章回顾了鸿蒙编程语言的发展历程:从早期支持JS和C/C++,到HarmonyOS 2引入Java,再到HarmonyOS 3推出ArkTS,直至HarmonyOS 5(NEXT)引入仓颉语言。仓颉作为华为自研的现代编程语言,具备高效编程、安全可靠、轻松并发和卓越性能等特性,适用于高性能高并发场景及未来AI原生应用开发。文章还探讨了仓颉与ArkTS的关系、应用场景以及是否需要重写现有应用等问题,为开发者选择编程语言提供了参考依据。
174 13
【HarmonyOS NEXT+AI】问答05:ArkTS和仓颉编程语言怎么选?
|
3月前
|
人工智能 JavaScript 前端开发
【HarmonyOS NEXT+AI】问答04:仓颉编程语言适合毕业设计吗?
本文探讨了仓颉编程语言是否适合用于毕业设计的问题。仓颉编程语言虽小众,但具备独特性与创新性,可开发鸿蒙应用及AI大模型应用,具有前瞻性。其语法与主流语言类似,易于上手,且有丰富课程支持学习。若时间充裕并结合相关主题,使用仓颉语言能让毕业设计在答辩中脱颖而出。同时,文章还介绍了毕业设计答辩的时间安排,帮助学生合理规划。
68 3
【HarmonyOS NEXT+AI】问答04:仓颉编程语言适合毕业设计吗?
|
11月前
|
人工智能 自然语言处理 搜索推荐
最强AI写作助手,内置4o模型,引领AI智能问答的新纪元
随着人工智能技术的飞速进步,BKAI凭借其强大的GPT-4o模型,正在重新定义智能问答的标准。其中表现最强的AI助手神器:BKAI
|
8月前
|
人工智能 自然语言处理 前端开发
VideoChat:高效学习新神器!一键解读音视频内容,结合 AI 生成总结内容、思维导图和智能问答
VideoChat 是一款智能音视频内容解读助手,支持批量上传音视频文件并自动转录为文字。通过 AI 技术,它能快速生成内容总结、详细解读和思维导图,并提供智能对话功能,帮助用户更高效地理解和分析音视频内容。
437 6
VideoChat:高效学习新神器!一键解读音视频内容,结合 AI 生成总结内容、思维导图和智能问答
|
8月前
|
人工智能 Java API
ChatClient:探索与AI模型通信的Fluent API
【11月更文挑战第22天】随着人工智能(AI)技术的飞速发展,越来越多的应用场景开始融入AI技术以提升用户体验和系统效率。在Java开发中,与AI模型通信成为了一个重要而常见的需求。为了满足这一需求,Spring AI引入了ChatClient,一个提供流畅API(Fluent API)的客户端,用于与各种AI模型进行通信。本文将深入探讨ChatClient的底层原理、业务场景、概念、功能点,并通过Java代码示例展示如何使用Fluent API与AI模型进行通信。
212 8
|
8月前
|
Web App开发 人工智能 自然语言处理
WebChat:开源的网页内容增强问答 AI 助手,基于 Chrome 扩展的最佳实践开发,支持自定义 API 和本地大模型
WebChat 是一个基于 Chrome 扩展开发的 AI 助手,能够帮助用户理解和分析当前网页的内容,支持自定义 API 和本地大模型。
660 1
|
7月前
|
人工智能 Kubernetes Cloud Native
荣获2024年AI Cloud Native典型案例,阿里云容器产品技术能力获认可
2024全球数字经济大会云·AI·计算创新发展大会,阿里云容器服务团队携手客户,荣获“2024年AI Cloud Native典型案例”。

热门文章

最新文章