Android JavascriptBridge 详解(二)

本文详细介绍了Android中使用WebViewJavascriptBridge进行Java和JavaScript交互的原理与实践,包括JsBridge的优缺点、使用步骤、交互方式以及案例实践,强调了安全性并提供了项目实例链接。
摘要由CSDN通过智能技术生成

原文出自:http://blog.csdn.net/sk719887916/article/details/47189607

Android开发目前现状来说,开发者大部分时间花在UI的屏幕适配上,使用原生控件开发成本已不是那么的理想,鉴于很多项目保持和iOS一致的UI界面风格,至使移动UI开发成本花费更大的代价,因此目前结合H5和原生控件混合开发是解决UI适配的一种很好的选择, 因此基于网页形式的插件更新业务功能出现了,处于APP性能的考虑,Android也会使用java和native层(C,C++)进行结合。无论是哪种结合,其实原理都差不多,只要按照它的协议来是很容易的,今天我们仅对于H5和Java层结合的混合开发,了解WebViewJavascriptBridge的使用。

如果已经掌握jsbridge的朋友可以直接进阶对他封装篇:

Android基于JsBridge封装的高效带加载进度的WebView:http://blog.csdn.net/sk719887916/article/details/52402470

什么是JsBridge

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

JSBridge的优点

Android API 4.4以前,谷歌的webview存在安全漏洞,网站可以通过js注入就可以随便拿到客户端的重要信息,甚至轻而易举的调用本地代码进行流氓行为,谷歌后来发现有此漏洞后,在API 4.4以后增加了防御措施,如果用js调用本地代码,开发者必须在代码申明JavascriptInterface,
列如在4.0之前我们要使得webView加载js只需如下代码:

4.4之后使用需要在调用Java方法加入@JavascriptInterface注解,如果代码无此申明,那么也就无法使得js生效,也就是说这样就可以避免恶意网页利用js对客户端的进行窃取和攻击。
但是即使这样,我们很多时候需要在js调用本地java代码的时候,要做一些判断和限制,或者有的场景也会做些过滤或者对用户友好提示,甚至更复杂的Hybrid模式下,需要js和native之间进行交互通讯,拍照上传,因此原生的JavascriptInterface 就比较维护了,特此有了基于JavascriptInterface 封装的WebViewJavascriptBridge框架。

使用JsBridge正确姿势

1 添加依赖

Eclipse:

  1. 导入jar包
  2. 直接copy jar的源码到工程

    JsBridge. jar可以到gitHub上直接下载。

    Android Studio:

  3. 配置gradle

      repositories {
       // ...
         maven { url "https://jitpack.io" }
    }
    dependencies {
       compile 'com.github.lzyzsd:jsbridge:1.0.4'
       }
    

2 WebView需使用jsBridge的webView

<com.github.lzyzsd.jsbridge.BridgeWebView
    android:id="@+id/webView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

JS和Native交互

JS是基于订阅和回调来实现Js和native交互的,我们需要在java中订阅,然后Js中回调,反之也可以。

3.1 Java

registerHandler()用来注册一个java函数,来实现js回调的handler,

  • 第一个:订阅的方法名
  • 第二个: 回调Handler , 参数返回js请求的resqustData,function.onCallBack()回调到js,调用function(responseData)

         //必须和js同名函数,注册具体执行函数,类似java实现类
         webView.registerHandler("submitFromWeb", new BridgeHandler() { 
          @Override  
          public void handler(String data, CallBackFunction function) {  
              function.onCallBack( data + “java”);  
                }  
          });  
    

3.2 JS

Js代码需要用window.WebViewJavascriptBridge.callHandler同步回调java层注册的同名函数,这和java和c库的jni调用如出一辙,方法名必须和Java层保持一致

  • 第一参数:方法名
  • 第二个:js调用native的请求参数
  • 第三个:js在被回调后具体执行方法,responseData为java层回传jsonStr.

    window.WebViewJavascriptBridge.callHandler(
    'submitFromWeb'
    , {'param': requsetData }
    , function(responseData) {
      // do somrthing 
     }
    );
    

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值