h5和原生结合开发app越来越流行。其实就是webview 的js调用native的方法。也就是需要搭建一个桥。这样的桥早就有人搭建好了,那就是jsbridge。

git地址:

https://github.com/lzyzsd/JsBridge.git

其实很简单,那些添加依赖我就不说了。

两种情况:

1.js调用本地的方法:

webView.loadUrl("http://testopen.cebbank.com/LifePayment/wap/apph5/index.html?uid=111&token=65F34B3203D893AD96173918C80C45B3&telno=16578915632&type=0&canal=yaoyaoshenghuo1&version=1.0.0&macValue=1167DA1CDF6379B94914C8CB5099542C");

        webView.registerHandler("wxpay", new BridgeHandler() {

            @Override
public void handler(String data, CallBackFunction function) {
// Toast.makeText(MainActivity.this, data, Toast.LENGTH_SHORT).show();
Gson gson = new GsonBuilder()
// 2013-09-14 16:45:29
.setDateFormat("yyyy-MM-dd HH:mm:ss")
// .setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ") .create(); OrderModel ordermodel=gson.fromJson(data,OrderModel.class);
requestWXPay(MainActivity.this,ordermodel);
Log.i(TAG, "handler: "+ordermodel.getAppid());
Log.i(TAG, "handler = submitFromWeb, data from web = " + data);
// function.onCallBack("submitFromWeb exe, response data 中文 from Java");
} });

js里面这样写:

    //call native method
window.WebViewJavascriptBridge.callHandler(
'wxpay'
//, {'param': '中文测试'}
, data.orderModel
, function(responseData) {
<!--document.getElementById("show").innerHTML = "send get responseData from java, data = " + responseData-->
}
);
  1. 本地给js发送消息, 调用网页的方法:

    本地这样写;
webView.callHandler("payResult", state, new CallBackFunction() {

            @Override
public void onCallBack(String data) {
// TODO Auto-generated method stub
// Log.i(TAG, "reponse data from js " + data);
} });

js里面这样写:

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': '测试中文!'
};
console.log('JS responding with', data);
responseCallback(data);
}); bridge.registerHandler("payResult", function(data, responseCallback) {
alert(data);
document.getElementById("show").innerHTML = ("data from Java: = " + data);
var responseData = "Javascript Says Right back aka!";
responseCallback(responseData);
});
})

就是一句户,方法名称对的上就可以了。

我这里只是总结了一下,其他的基础东西,自己看githup.

使用jsbridge遇到ssl认证的网站,结果一片空白。也就是https开头的。比如银联支付的页面。那么一开始我就设置了一个处理的webview,

WebViewClient webviewclient=new WebViewClient(){
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed();
}
}; webView.setWebViewClient(webviewclient);

后来,这个webview可以访问银联这种ssl认证的参数,但是不能响应js的调用了。

一直报错:

"Uncaught TypeError: Cannot call method 'callHandler' of undefined", source

我就知道jsbridge肯定自己设置了一个自己的webviewlicent,查看源码库,找到了:

package coma.github.lzyzsd.jsbridge;

 private void init() {
this.setVerticalScrollBarEnabled(false);
this.setHorizontalScrollBarEnabled(false);
this.getSettings().setJavaScriptEnabled(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
this.setWebViewClient(generateBridgeWebViewClient());
} protected BridgeWebViewClient generateBridgeWebViewClient() {
return new BridgeWebViewClient(this);
}

这里,然后这个BridgeWebViewClient我们需要重写,让他支持ssl:

package coma.github.lzyzsd.jsbridge;

import android.graphics.Bitmap;
import android.net.http.SslError;
import android.webkit.SslErrorHandler;
import android.webkit.WebView;
import android.webkit.WebViewClient; import java.io.UnsupportedEncodingException;
import java.net.URLDecoder; /**
* Created by bruce on 10/28/15.
*/
public class BridgeWebViewClient extends WebViewClient {
private BridgeWebView webView; public BridgeWebViewClient(BridgeWebView webView) {
this.webView = webView;
} @Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { handler.proceed();
}

ok,既可以使用js,也可以支持ssl。

JsBridge "Uncaught TypeError: Cannot call method 'callHandler' of undefined", source的更多相关文章

  1. “Uncaught TypeError: Cannot call method 'createChild' of undefined" 问题的解决

    Uncaught TypeError: Cannot call method 'createChild' of undefined 我在使用Ext 4.1.1做grid.Panel,然后chrome爆 ...

  2. bootstrap datepicker Uncaught TypeError: Cannot call method 'split' of undefined问题

    这个问题主要是由于date对象不是字符串,不能使用 split 函数,简单处理一下,转换成字符串就可以解决问题: ++++++++++++++++++++++++ parseDate: functio ...

  3. SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论 SignalR 简单示例 通过三个DEMO学会SignalR的三种实现方式 SignalR推送框架两个项目永久连接通讯使用 SignalR 集线器简单实例2 用SignalR创建实时永久长连接异步网络应用程序

    SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论   异常汇总:http://www ...

  4. Uncaught TypeError: Cannot read property 'msie' of undefined

    因为图方便,抄了别人写的一个jquerry插件,运行时“var pos = ($.browser.msie && parseInt($.browser.version) <= 6 ...

  5. easyui使用时出现这个Uncaught TypeError: Cannot read property 'combo' of undefined

    easyui使用时出现这个Uncaught TypeError: Cannot read property 'nodeName' of undefined 最后检查发现是必须给select一个id,光 ...

  6. reactjs Uncaught TypeError: Cannot read property 'location' of undefined

    reactjs Uncaught TypeError: Cannot read property 'location' of undefined reactjs 路由配置 怎么跳转 不成功 国内搜索引 ...

  7. index.js:13 Uncaught TypeError: Cannot read property 'split' of undefined

    使用 webpack 编译 Vue 项目时出现报错: index.js:13 Uncaught TypeError: Cannot read property 'split' of undefined ...

  8. Uncaught TypeError: Cannot read property ‘split’ of undefined

    问题 :Uncaught TypeError: Cannot read property ‘split’ of undefinedat HTMLLIElement. split()切割的问题 因为遍历 ...

  9. DataTable插件报错:Uncaught TypeError: Cannot read property 'style' of undefined

    DataTable插件报错:Uncaught TypeError: Cannot read property 'style' of undefined 原因:table 中定义的列和aoColumns ...

随机推荐

  1. 【QT】Qaction和触发函数建立连接的方法

    说明:我是在ui里面编辑好控件以及位置,然后在程序里面将控件和触发函数进行绑定,实现的触发操作. 代码如下: MainWindow::MainWindow(QWidget *parent) : QMa ...

  2. 压力测试工具ab的使用

    ab是Apache自带的HTTP压力测试工具,全称是ApacheBench 路径为\Apache\bin\ab.exe 参数文档: http://httpd.apache.org/docs/2.2/p ...

  3. Linux学习_按时间顺序解压多个文件,搜索文件中的内容

    ls的结果按时间数据先排序,再取末尾5个文件,再调用tar命令 ls -1 | sort -u | tail -5 |xargs -n1 tar xzvf 利用grep命令从文件中搜索. grep - ...

  4. centos6.5_64bit-kvm安装部署

    kvm部署安装   目录 kvm部署安装... 1 一.kvm部署... 1 1.关闭selinux和防火墙... 1 2.查看主机是否支持虚拟化... 1 3.安装kvm和其他虚拟化软件包... 1 ...

  5. linux基础命令-mkdir/tree/rmdir

    命令行的展开 ~: 展开为用户的主目录 ~USERNAME: 展开为指定用户的主目录 {}:可承载一个以逗号分隔的列表,并将其展开为多个路径 [root@host01 tmp]# mkdir -vp ...

  6. 关于HTML5,最牛逼的10本书!

    关于HTML5,最牛逼的10本书! 关于HTML5,最牛逼的10本书.rar HTML5+CSS3从入门到精通 李东博 著 推荐指数:★★★☆ 简介:本书通过基础知识+中小实例+综合案例的方式,讲述了 ...

  7. Android程序员不容错过的10款在线实用工具

    Android十款在线工具,在做Android开发过程中,会遇到一些小的问题,虽然自己动手也能解决,但是有了一些小工具,解决这些问题就得心应手了.Android在线工具,包括在线测试工具,及其他较为重 ...

  8. IOS通讯录的隐藏标签【电话】的特殊功能(在IOS11已失效)

    这功能比较适合有强迫症,爱折腾的人哈!! 规范了通讯录标签,以后可以轻松的知道别人是用短号还是亲情网给你打电话. 如果是长号还可以显示归属地. 也许从IOS8(不太清楚)开始自带了号码归属地显示功能, ...

  9. OpenGL学习 Introduction

    OpenGL and Graphics Pipeline The word pipeline is from production lines in factories.Generating a pr ...

  10. Hive 常用命令和语句

    示例数据库为 db_hive 1. 创建表 create-table.sql create table if not exists db_hive.tb_user ( id int, username ...