Android WebView 与Js 交互【 详解 二】—— JSBridge 三方库轻松实现

Kotlin实现jsBridge技术详解 随着移动互联网的蓬勃发展,混合应用模式成为了众多开发者的新选择。在这个模式中,JavaScript Bridge(简称jsBridge)扮演了一个关键角色,它是连接原生应用(Native App)与移动网页(Web View)之间的一座桥梁。通过jsBridge,我们可以实现两者之间的数据交换和功能调用,使得原生应用可以调用JavaScript代码,同时JavaScript代码也能操作原生接口。这个过程不仅增强了应用的动态性和可扩展性,还能够在不更新应用的情况下,更新Web页面和功能逻辑。 阅读详情

【摘要】按安卓开发目前现状来说,开发者大部分时间还是花在UI的屏幕适配上,使用原生控件开发成本已不是那么理想,而目前结合Html5和原生控件是解决UI适配的一种很好的选择,处于APP性能也会用java和native层进行结合。不管是哪种结合,其实原理都差不多,只要按照它的协议来,是很容易的。

对此针对 webView与js的通信上的问题,我简单做了如下总结,欢迎大家多多指正,共同进步。

如果你对 Android 原生方法实现 与 js 交互还不是很清楚,请移步至:

  Android WebView 与Js 交互【 详解 一 】  https://blog.youkuaiyun.com/adminlxb89/article/details/81702855

  android使用html+javascript来制作页面    https://www.cnblogs.com/HighFun/p/3458572.html#undefined

今天,主要介绍通过三方库实现 java 与 js 交互,学习下WebViewJavascriptBridge。

1.什么是webViewjavascripBridge?

WebViewJavascriptBridge是移动UIView和Html交互通信的桥梁,用作者的话来说就是实现java(ios为oc)和js的互相调用的桥梁。替代了WebView的自带的JavascriptInterface的接口,使得我们的开发更加灵活和安全。

2. 为什么要用webViewjavascripBridge?优势在哪里?

    对于安卓开发有一段时间的人来说,知道安卓4.4以前谷歌的webview存在安全漏洞,网站可以通过js注入就可以随便拿到客户端的重要信息,甚至轻而易举的调用本地代码进行流氓行为,谷歌后来发现有此漏洞后,增加了防御措施,如果要是js调用本地代码,开发者必须在代码申明JavascriptInterface,

   列如在4.0之前我们要使得webView加载js只需如下代码:

mWebView.addJavascriptInterface(new JsToJava(), "myjsfunction");  

     4.4之后调用需要在调用方法加入加入@JavascriptInterface注解,如果代码无此申明,那么也就无法使得js生效,也就是说这样就可以避免恶意网页利用js对安卓客户端的窃取和攻击。

        但是即使这样,我们很多时候需要在js记载本地代码的时候,要做一些判断和限制,或者有可能也会做些过滤和对用户友好提示,因此JavascriptInterface也就无法满足我们的需求了,特此有大神就写出了WebViewJavascriptBridge框架。

 JSBridge的开源库下载地址:https://github.com/lzyzsd/JsBridge。

3.如何使用webViewjavascripBridge?

   3.1 将jsBridge.jar引入到我们的工程

        Eclispe: 导入jar包, 或者直接copyjar源码, jar可以到gitHub上下载。

        Android Studio: 

repositories {
    maven { url "https://jitpack.io" }
}

dependencies {
    compile 'com.github.lzyzsd:jsbridge:1.0.4'
}

   3.2 布局文件

  3.3  JsBridgeSimpleActivity.java 

public class JsBridgeSimpleActivity extends AppCompatActivity {
    private static final String TAG = JsBridgeSimpleActivity.class.getSimpleName();
    @Bind(R.id.tv_show_result)
    TextView tvShowResult;
    @Bind(R.id.webView)
    BridgeWebView webView;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_js_bridge_simple);
        ButterKnife.bind(this);
        initView();
    }

    private void initView() {
        WebSettings settings = webView.getSettings();
        settings.setJavaScriptEnabled(true);
        //初始化JSBridge,与 js 建立链接
        webView.setDefaultHandler(new DefaultHandler());
        webView.setWebChromeClient(new WebChromeClient() {
            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {

                return super.onJsAlert(view, url, message, result);
            }
        });
        webView.loadUrl("file:///android_asset/jsbridge.html");

        //注册函数,让js 调用
        webView.registerHandler("submitFromWeb", new BridgeHandler() {
            @Override
            public void handler(String data, CallBackFunction function) {
                Log.i(TAG, "这是 html 返回的数据:\n" + data);
                Toast.makeText(JsBridgeSimpleActivity.this, data, Toast.LENGTH_LONG).show();
                //对数据处理后,回传给js
                String substring = data.substring(0, 5);
                if (function != null) {
                    function.onCallBack(substring);
                }
            }
        });

    }

    @OnClick({R.id.btn_send_message_to_js, R.id.btn_call_js_method})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.btn_send_message_to_js: //发消息给js
                mJavaSendToMessage();

                break;
            case R.id.btn_call_js_method: //java 调用js 方法
                mJavaCallJs();
                break;
        }
    }

    private void mJavaSendToMessage() {
        //java 发送给 js 的数据
//                webView.send("hello");
        webView.send("Hello", new CallBackFunction() {
            @Override
            public void onCallBack(String data) {
                Log.i(TAG, "java 发送给 js 数据后的 回调数据:\n" + data);
            }
        });
    }

    private void mJavaCallJs() {
        webView.callHandler("functionInJs", "data from java", new CallBackFunction() {
            @Override
            public void onCallBack(String data) {
                Log.i(TAG, "回调数据来自 js =:\n" + data);
            }
        });
    }
}

  3.4 Html和js实现代码

<html>

<head>
    <meta content="text/html; charset=utf-8" http-equiv="content-type">
    <title>js调用java</title>
</head>
<body>
<p>
    <xmp id="show"></xmp>
</p>
<p>
    <xmp id="init"></xmp>
</p>

<p>
    <input type="text" id="text1" value="用户名(username)"/>
</p>
<p>
    <input type="text" id="text2" value="password"/>

<p>
    <input id="enter" onclick="testClick();" type="button" value="发消息给Native"/>
</p>
<p>
    <input id="enter1" onclick="testClick1();" type="button" value="调用Native方法"/>
</p>

</body>

<script>

        function testClick() {
        var str1 = document.getElementById("text1").value;
        var str2 = document.getElementById("text2").value;
        //发送消息给java代码
        var data = "name=" + str1 + ",pass=" + str2;
        window.WebViewJavascriptBridge.send(
        data
        , function(responseData) {
        document.getElementById("show").innerHTML = "repsonseData from java, data = " +responseData
        });
        }

        function testClick1() {
        var str1 = document.getElementById("text1").value;
        var str2 = document.getElementById("text2").value;
        //调用本地java方法
        window.WebViewJavascriptBridge.callHandler(
        'submitFromWeb'
        , {'param': str1}
        , function(responseData){
        document.getElementById("show").innerHTML = "send get responseData from java, data = " + responseData
        });
        }

        function bridgeLog(logContent) {
        document.getElementById("show").innerHTML = logContent;
        }

        //注册事件监听
        function connectWebViewJavascriptBridge(callback) {
        if (window.WebViewJavascriptBridge) {
        callback(WebViewJavascriptBridge)
        } else {
        document.addEventListener(
        'WebViewJavascriptBridgeReady'
        , function() {
        callback(WebViewJavascriptBridge)
        },
        false
        );
        }
        }

        //注册回调函数,第一次连接时调用 初始化函数
        connectWebViewJavascriptBridge(function(bridge) {
        bridge.init(function(message, responseCallback) {
        console.log('JS got a message', message);
        var data = {
        'Javascript Responds': 'Wee!'
        };
        console.log('JS responding with', data);
        responseCallback(data);
        });

        //注册函数,让java 调用
        bridge.registerHandler("functionInJs", function(data, responseCallback) {
        document.getElementById("show").innerHTML = ("data from Java: = " + data);
        var responseData = "Javascript Says Right back aka!";
        responseCallback(responseData);
        });
        })

</script>

</html>

4.小结

通过以上代码示例,不难发现此框架的优雅和简便,对js和java双方来说,如果Html中的js需要调用java代码,而java代码没做任何实现,那么js中方法也是无效的,反之java代码注册的函数,没在js里去回调实现,那么Java层也是无法获取js中数据的,由此可见,此通信是双方支持的,必须由双方来约定,这样就避免了Android之前存在的js注入漏洞,也很大的提高了安全性,也可以保证我们的网页数据不被第三方的APP获取。

参考文章:https://blog.youkuaiyun.com/sk719887916/article/details/47189607

JsBridge使用和原理 https://www.jianshu.com/p/910e058a1d63

5.其他三方库代替 Android WebView

AgentWeb , 一个简洁易用的 Android Web 库:    https://www.jianshu.com/p/c80da1c41af7

腾讯浏览器(X5WebView的使用):    https://blog.youkuaiyun.com/EUEHEUEN/article/details/79414551

 

JSBridge:JSBridge-用于Resco Mobile CRM的Javascript API JSBridge JSBridge-用于Resco Mobile CRM的Javascript API 离线HTML解决方案的工作和调试入门。 介绍 可以使用HTML + Javascript代码扩展Resco Mobile CRM应用程序功能。 您的包含自定义代码的html文件可以在线和离线执行。 脱机html文件是Woodford定制项目的一部分。 观看网络研讨会,了解Resco MobileCRM中的OfflineHTML简介。 版本包含Resco Mobile CRM应用程序的调试/开发版本。 每个平台的应用程序包均可用。 内嵌框架 您可以在应用程序的各个组件中放置一个称为IFrame的网络浏览器。 IFrame可以在EntityForm,EntityList或HomeForm中使用。 IFrame指向您的自定义html代码文件。 在这个资料库中 docs 对Resc 立即下载

相关推荐

AD17入门简单教程(一)

AD17入门简单教程 我写这篇文章主要是因为最近刚学习完了AD17,想做一下总结,也希望通过自己心得的帮助一些刚入门AD17的小白。 总结一共分为两大部分,包括AD17的下载安装与汉化(文末有详细链接)、工程的创建、元器件库、PCB、走线中的常用命令介绍,文末还附有完整的PCB工程以及讲解视频。 第一部分工程的创建及元器件库常用命令 1.首先在桌面上创建一个文件夹,然后在AD17点击左上角的文件中...

qq_45433195的博客 2万+

WebView与JavaScriptBridge的基本使用方式

WebView的常用方法和JS桥的基本使用方式,以及一个简单的demo示例

MIILN的博客 5321

BMC的风扇控制 (Fan speed control)

这篇文章是我刚开始做风扇功能的时候写的,因为那时候都找不到主管要我报告的内容,所以报告完就顺便整理一下,最近因为在修控制学,之后应该会再补一篇和控制学相关的内容 (如果有空的话) BMC的风扇控制算一个蛮重要的功能,那这个功能包含了"TACH"和"PWM"这两个常用讯号怎么解读,还有最常用的控制演算法"PID(closed loop)"和"Stepwise(openloop)",而另外的Error control ,因为每家做法不同,就不会在这边作介绍 ##实作程式码是来自Facebook的openBM

yeiris的博客 1万+

Vue中封装WebViewJavascriptBridge实现与app原生交互

原生app里边一些需要页面需要h5来实现,涉及到app原生与h5交互,记录一下。

CaseyWei 3701

OFDM时频脉冲形状与子载波正交性的理解

从多载波调制的角度来理解子载波间正交,首先要明确OFDM默认的脉冲成型是时域矩形窗,时域上每个子载波 ej2πfnte^{j2πf_nt}ej2πfn​t 都被一个矩形窗脉冲gT(t)g_T(t)gT​(t)成型。其次,OFDM子载波间隔 等于 OFDM符号周期的倒数,这是子载波正交的条件。 ​ 根据时频脉冲形状,可以从时域上理解如左图(注意是矩形脉冲 乘 复指数),从频域上理解如右图(sinc脉冲 卷 频点)。 ​

weixin_43803202的博客 2215

webview原理和JSBridge

webview是一个嵌入式的浏览器,我们平常使用频率最高的就是客户端内嵌的webview 特点:运行在webview中的JS代码有能力调用原生的系统API,没有传统浏览器沙箱的限制。 目前javascript和客户端(后面统称native)交互的常见方式有两种 JSBridge schema JSBridge 当我们在native内打开m页,native会在全局的window下,为我们注入一个Bridge。这个Bridge里面,会包含我们与native交互的各种方法、比如判断第三方App是否安装、获取网

分享前端开发工程师的一些日常生活、前端知识点、职业发展、对一些问题的看法、感悟等等 8952

X线DR医学图像 --- DR医用滤线栅及摩尔纹详解 (二) 摩尔纹的产生机理

1,横向摩尔纹的表现 2,纵向摩尔纹的表现 3,摩尔纹在pitch = 143μm(注:pitch为采样间隔/周期)的FPD上的表现。 4,摩尔纹的危害(严重的影响了临床诊断) 5,摩尔纹对胸片肺部肺纹理的破坏 6,滤线栅的频率(滤线栅生产厂家的产品参数)。判断摩尔纹产生的重要依据之一 7,DR平板探测器的采样频率/空间极限分辨率 l.........

松下J27录放机 4981

WebViewJavascriptBridge

Web 页面中的 JS 与 iOS Native 如何交互?JS 和 iOS Native 就好比两块没有交集的大陆,如果想要使它们相互通信就必须要建立一座“桥梁”是盛名已久的 JSBridge 库,它仅使用了少量代码就实现了对于 Mac OS X 的 WebView 以及 iOS 平台的 UIWebView 和 WKWebView 三种组件的完美支持。WebViewJavascriptBridge 主要是作为 Mac OS X 和 iOS 端(Native 端)与 JS 端相互通信,互相调用的桥梁。

2301_76965813的博客 1765

信息安全管理与评估赛题解析-单机取证(含环境)

链接:https://pan.baidu.com/s/1OMzIq884dW2vAiUp0k2Ppg。链接:https://pan.baidu.com/s/1i5daMqhD53wYeQ6hYzRK6Q。链接:https://pan.baidu.com/s/1QFAjdQZK4sJ-gGRP42XPKA。链接:https://pan.baidu.com/s/1BSXvqN2ZGCQXewgFULoeyQ。链接:https://pan.baidu.com/s/1g9zu5ngBz_KMjW1eBMkJAw。

Brucye 1834

从后端角度浅谈抗辐射设计----三模冗余(TMR)

三模冗余设计(TMR),是最常用的一种容错技术,三个模块采取相同的操作,以多数相同的输出作为表决系统的正确输出,即3取2,因为三个模块是相互独立的,而其中两个模块同时出错的概率是极小的,因此便可保证系统输出的可信度。然而这个设计也会存在面积浪费,功耗的增加,而且由于是冗余的设计,在后续进行综合或者pr的时候会被工具优化,因此需要对模块进行don’t touch设置;通过增值表得到,逻辑关系表达式为:Q=(Q1&Q2)|(Q1&Q3)|(Q2&Q3),通过工艺库的stdcell进行搭建,得到如下电路。

芯冰乐 327

qiankun v3 常见问题排查实战:从构建插件、CORS 到生命周期与样式隔离的完整 FAQ 指南

qiankun 3 以 HTML Entry 流式加载、Proxy 膜(membrane)JS 沙箱与原生 CSS `@scope` 样式隔离重塑了微前端运行时,也随之带来了与 2.x 截然不同的排查思路。本文以官方 FAQ([docs/faq/index.md](https://link.gitcode.com/i/8a3167981224a35b4d4d3f535bc305ad))为骨架,逐条

gitblog_00147的博客 1092

Autosar软件组件分析及ARXML文件分析

Autosar软件组件分析及ARXML文件分析

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 3602

探索JSBridge-Android:一款强大的移动端JavaScript与Android交互框架

探索JSBridge-Android:一款强大的移动端JavaScript与Android交互框架 项目地址:https://gitcode.com/gh_mirrors/js/JSBridge-Android 项目简介 是一个开源的框架,它旨在简化JavaScript和Android原生代码之间的通信。通过这个库,开发者可以在Web页面中调用Android的API,实现丰富的功能扩展,如访问设备...

gitblog_00005的博客 1211

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

android调用js方法多参数,这也许是功能最强大的Android与Javascript交互开源库

项目中为了减少端上开发量,通常会使用一些跨平台的解决方案,而 web 就是最简单、兼容性最强的方案,但 web 又受制于浏览器,不能直接访问系统的一些属性,而且我们也需要 web 调用 native 的一些方法,所以我们需要一套 web 和 native 双向交互的方案。目前,Android 要实现与 web 交互有以下几种常用方案:WebView addJavascriptInterface方法...

weixin_28665677的博客 874

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

JXBWKWebView JSBridge实战指南:实现Web与Native无缝通信

想要在iOS应用中实现Web页面与原生功能的完美融合吗?JXBWKWebView JSBridge正是你需要的终极解决方案!🚀 这个强大的iOS组件基于WKWebView构建,提供了完整的JSBridge通信机制,让Web与Native之间的交互变得简单、高效且可靠。 ## 什么是JXBWKWebView JSBridge? JXBWKWebView JSBridge是一个专业的iOS We

gitblog_00810的博客 633

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

探索无缝沟通新境界:使用JsBridge实现高效JavaScript与Android交互

探索无缝沟通新境界:使用JsBridge实现高效JavaScript与Android交互 在移动开发领域,JavaScript与原生应用的交互一直是开发者们关注的热点。今天,我们为您介绍一款高效、灵活的开源项目——JsBridge,它旨在简化Android应用中JavaScript与原生代码的深度整合,为您的跨平台开发之旅添翼助力。 项目介绍 JsBridge是基于原有优秀项目lzyzsd/JsB...

gitblog_00076的博客 529

探索 JsBridge-Android:一款强化Web与原生Android交互的利器

探索 JsBridge-Android:一款强化Web与原生Android交互的利器 在移动应用开发中,Web页面和原生App的交互是一个至关重要的环节。而项目恰好解决了这个问题,提供了一种高效、灵活的方式来打通JavaScript和Android之间的通信壁垒。 项目简介 JsBridge-Android 是一个轻量级的Android库,它允许JavaScript代码通过简单的API调用来调用A...

gitblog_00091的博客 535

JsBridge安装与配置完全指南

JsBridge安装与配置完全指南 项目基础介绍及主要编程语言 项目名称: JsBridge 主要编程语言: Java, JavaScript 简介: JsBridge 是一个灵感来源于微信Webview JsBridge的开源项目,旨在提供一个安全且便利的方法来在Java和JavaScript之间建立通信桥梁。它允许开发者轻松地从JavaScript调用Java代码,以及反过来从Java触发Ja...

gitblog_07960的博客 758

AgentWeb与JS交互终极指南:从零构建安全通信桥梁

AgentWeb作为Android平台上功能强大的WebView库,为开发者提供了简单高效的JavaScript与Android原生代码交互解决方案。通过AgentWeb,您可以轻松构建安全的双向通信桥梁,实现Web页面与原生应用的无缝集成。本指南将带您深入了解AgentWeb的JS交互机制,掌握从基础到进阶的完整使用方法。 ## 🔥 AgentWeb JS交互核心优势 AgentWeb在J

gitblog_01136的博客 821

探索JSBridge:一个高效、易用的移动端JavaScript与原生应用交互框架

探索JSBridge:一个高效、易用的移动端JavaScript与原生应用交互框架 项目简介 JSBridge 是一个轻量级的框架,用于在移动应用(主要是Android和iOS)中实现JavaScript与原生代码的无缝交互。它允许开发者在Web页面上调用手机设备的各种原生功能,如访问硬件信息、发送短信、读取联系人等,同时也能让原生应用程序调用JavaScript方法,从而实现更丰富的用户体验。 ...

gitblog_00046的博客 636

JsBridge基本用法

Android开发中,由于Android系统的碎片化比较严重,开发者多数时间放在UI的适配上,使用原生控件开发耗时耗力,而且在实现复杂界面时,原生控件的布局能力较弱,一种常见的方案是使用H5来负责复杂界面的布局,用Android提供的原生控件WebView进行加载,但界面和系统的逻辑交互以及数据交换,又成为了一个问题,JsBridge的诞生正好解决了这一难题。1,JsBridge基本概念Androi

fengxingzhe001的专栏 6318

iOS/Android与前端Vue的交互

这阵子移动端两个端都和前端做了交互 记录一下 前端调用iOS/Android(以目前前端最流行的框架Vue为例 ) //判断安卓 const isAndroid = navigator.userAgent.indexOf('Android') > -1 || navigator.userAgent.indexOf('Linux') > -1; //判断iOS const isIOS = !!navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Ma

hsany330的专栏 688

AgentWeb终极指南:Android与JS交互完整实战教程

AgentWeb是一个基于Android WebView的强大库,为开发者提供了便捷的Android与JavaScript交互解决方案。本教程将带您快速掌握AgentWeb的核心功能,轻松实现Android与JS的无缝通信,让您的应用具备更丰富的交互能力。 ## 一、AgentWeb架构解析 AgentWeb采用模块化设计,主要由五大核心组件构成,确保了功能的灵活性和可扩展性。 [![Age

gitblog_00627的博客 917

探索autojs-webView:强大的WebView扩展工具

探索autojs-webView:强大的WebView扩展工具 项目介绍 autojs-webView 是一个专为Auto.js设计的WebView扩展工具,旨在提供更丰富的WebView功能和更便捷的开发体验。通过这个项目,开发者可以在Auto.js中轻松实现WebView的初始化脚本注入、JavaScript与Auto.js的双向通信、Markdown文件渲染等功能。无论是简单的脚本注入,还是...

gitblog_00795的博客 902
上一篇: 【转】Android WebView 与Js 交互【 详解 一 】
下一篇: Android MVVM原理详解
LXB-89
博客等级 码龄11年 34粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值