Admob使用版本︰Goole Play Service 4.0版
一、問題
今天在Debug模式下,可以正常和網頁透過Javscript interface溝通,
但是一旦使用正式金鑰釋岀apk時,
卻遇到
"Uncaught TypeError: Object [object Object] has not method 'xxxxx'", source: http://xxxxxx
的問題。
二、解決辦法
這個問題也是因為proguard沒有宣告規則導致的問題。需要在proguard.cfg檔裡宣告如下
# 添加以下的程式碼才能讓webview的javascript能正常運作
-keep public class com.yourpackage.WebViewActivity$yourwebview_interface
-keep public class * implements com.yourpackage.WebViewActivity$yourwebview_interface
-keepclassmembers class com.yourpackage.WebViewActivity$yourwebview_interface {
;
}
-keepattributes JavascriptInterface
舉個例來看, 下面是我在Java裡使用Webview的簡單例子
private void setWebview(){
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new WebViewHandler(), "handler");
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
LogPrint.i(TAG, "onPageFinished ,url: "+url);
//呼叫網頁當下頁面的js函式:getVXML(),然後網頁js會呼叫回來下方的函式︰receiveValueFromJs()
webView.loadUrl("javascript:getVXML()");
super.onPageFinished(view, url);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return super.shouldOverrideUrlLoading(view, url);
}
});
webView.loadUrl(webViewUrl);
}
class WebViewHandler {
//網頁當下頁面的js函式:getVXML()會呼叫這隻Native函式︰receiveValueFromJs(String data)
public void receiveValueFromJs(String data) {
}
}
那麼,
在proguard.cfg檔裡,
則要宣告混淆規則如下︰
# 添加以下的程式碼才能讓webview的javascript能正常運作
-keep public class com.yourpackage.WebViewActivity$WebViewHandler
-keep public class * implements com.yourpackage.WebViewActivity$WebViewHandler
-keepclassmembers class com.yourpackage.WebViewActivity$WebViewHandler {
;
}
-keepattributes JavascriptInterface
填寫完混淆規則後,
輸岀正式金鑰的apk檔,
這時候Webview javascript interface就能繼續正常使用了。
