最近在給單位搞一個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