最近在给单位搞一个android的hybrid开发外壳,使用kotlin语言。由于之前一直都只做hybrid的前端部分,基本只是调用原生壳里的android方法,Android方面开发经验不足,遇到一个webview中找不到bridge对象的问题,下面描述以下问题:
在Hybrid开发中,一般使用第三方的bridge通信库,这种库可以使原生和前端webview进行信息传递和方法互调,我采用的JsBridge这个库,https://github.com/lzyzsd/JsBridge
由于之前做过hybrid的前端部分开发,知道在使用这个库之后,原生端会在webview的window对象中插入一个WebViewJavascriptBridge对象,这个对象就是可以用call和register两大方法来和原生通信的关键对象。没有他就无法和原生通信!
要使用这个WebViewJavascriptBridge必须在原生端,android这边用BridgeWebView替代原来的WebView对象,layout里面的xml也需要用这个对象对应的控件才行。
然而奇怪的事情发生了,我把所有的WebView对象换成了BridgeWebView对象之后,一切都运行正常,但是前端(vue)在调用window.WebViewJavascriptBridge却提示这个对象undefined。这说明原生端还是没有把这个对象插入到webview,用的还是原来android自带的webview,这就是个简单的浏览器呀。
我辛苦找了一整天,排除了手机系统问题,模拟器问题,xml布局问题,调用逻辑问题,最终确定了bug位置!
webViewClient也要设置成BridgeWebViewClient对象的overide!
万万没想到,这真的是太坑了,下面是正确代码(kotlin):
mWebView.webViewClient = object : BridgeWebViewClient(mWebView) {
override fun onPageFinished(view: WebView?, url: String?) {
if (splashView != null) Animation().fadeOut(splashView as View, 1000)
super.onPageFinished(view, url)
}
override fun onReceivedError(
view: WebView?,
request: WebResourceRequest?,
error: WebResourceError?
) {
Log.i(tag, "onReceivedError")
view?.loadUrl("file:///android_asset/error.html")
super.onReceivedError(view, request, error)
}
override fun onReceivedHttpError(
view: WebView?,
request: WebResourceRequest?,
errorResponse: WebResourceResponse?
) {
Log.i(tag, "onReceivedHttpError")
view?.loadUrl("file:///android_asset/error.html")
super.onReceivedHttpError(view, request, errorResponse)
}
}
最终帮我我发现问题的源头的帖子是:
https://github.com/lzyzsd/JsBridge/issues/29