JavaScript 接口找不到函数
JavaScript Interface Cannot Find Function
我有一个只有一个功能的 JavaScriptInterface
class。该函数用 @JavascriptInterface
注释,我相信我已经正确设置了它。
public class JavaScriptInterface {
...
@JavascriptInterface
public void processBody(String uri, String body) {
Log.d(TAG, "Process body");
...
}
}
然后我在 WebView
上设置 JavaScriptEnabled 并尝试调用函数:
final WebView webView = new WebView(this);
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new JavaScriptInterface(), "java");
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
Log.d(TAG, "Page finished");
callJavaScript();
}
});
页面完成加载,然后我尝试了多种方法从我的 JavaScriptInterface
调用 JavaScript 函数。使用这两种方法之一:
view.evaluateJavascript(javascript);
view.loadUrl("javascript:" + javascript);
其中一个 javascript 字符串:
"(function() { window.java.processBody('" + url + "', document.body.innerHTML); })()"
"(function() { processBody('" + url + "', document.body.innerHTML); })()"
"window.java.processBody('" + url + "', document.body.innerHTML);"
"processBody('" + url + "', document.body.innerHTML);"
每次我收到错误信息:
I/chromium: [INFO:CONSOLE(1)] "Uncaught TypeError: processBody is not a function", source: (1)
虽然在旧设备(KitKat 之前)上错误消息从未出现,但该函数从未被调用。
此方法之前也一直有效,我相信我没有为此更改任何代码 activity。我今天早上才知道这个错误。
正如我们与 Bryan 一起发现的那样,问题是由于 ProGuard 剥离了未从 Java 调用的函数。一个快速简单的测试是在Java中添加一些调用JS接口函数的代码,看看是否有帮助。
有关如何配置 ProGuard 以不去除注入的 Java 对象的方法的信息,请参阅 How to configure proguard for javascript interface?
我有一个只有一个功能的 JavaScriptInterface
class。该函数用 @JavascriptInterface
注释,我相信我已经正确设置了它。
public class JavaScriptInterface {
...
@JavascriptInterface
public void processBody(String uri, String body) {
Log.d(TAG, "Process body");
...
}
}
然后我在 WebView
上设置 JavaScriptEnabled 并尝试调用函数:
final WebView webView = new WebView(this);
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new JavaScriptInterface(), "java");
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
Log.d(TAG, "Page finished");
callJavaScript();
}
});
页面完成加载,然后我尝试了多种方法从我的 JavaScriptInterface
调用 JavaScript 函数。使用这两种方法之一:
view.evaluateJavascript(javascript);
view.loadUrl("javascript:" + javascript);
其中一个 javascript 字符串:
"(function() { window.java.processBody('" + url + "', document.body.innerHTML); })()"
"(function() { processBody('" + url + "', document.body.innerHTML); })()"
"window.java.processBody('" + url + "', document.body.innerHTML);"
"processBody('" + url + "', document.body.innerHTML);"
每次我收到错误信息:
I/chromium: [INFO:CONSOLE(1)] "Uncaught TypeError: processBody is not a function", source: (1)
虽然在旧设备(KitKat 之前)上错误消息从未出现,但该函数从未被调用。
此方法之前也一直有效,我相信我没有为此更改任何代码 activity。我今天早上才知道这个错误。
正如我们与 Bryan 一起发现的那样,问题是由于 ProGuard 剥离了未从 Java 调用的函数。一个快速简单的测试是在Java中添加一些调用JS接口函数的代码,看看是否有帮助。
有关如何配置 ProGuard 以不去除注入的 Java 对象的方法的信息,请参阅 How to configure proguard for javascript interface?