【问题标题】:JavaScript Interface Cannot Find FunctionJavaScript 接口找不到函数
【发布时间】:2016-01-29 15:42:33
【问题描述】:

我有一个具有单一功能的 JavaScriptInterface 类。该函数带有@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 之前)上,错误消息永远不会出现,但函数永远不会被调用。

此方法以前也有效,我不相信我已更改此活动的任何代码。我今天早上才知道这个错误。

【问题讨论】:

  • 您在为您的应用程序使用 ProGuard 吗?它可以去除不是从 Java 调用的函数。一个简单的测试是在 Java 中添加一些调用您的函数的代码,看看它是否有帮助。
  • @MikhailNaganov 啊!我是。我一定是重构了我的JavaScriptInterface 的位置!我没有想到这一点,我讨厌 ProGuard 不遵循重构代码!谢谢,发布一个答案,以便我将其标记为正确。

标签: javascript android android-webview chromium typeerror


【解决方案1】:

正如我们与 Bryan 一起发现的,问题是由于 ProGuard 剥离了不是从 Java 调用的函数。一个快速简单的测试是在Java中添加一些调用JS接口函数的代码,看看是否有帮助。

有关如何配置 ProGuard 不剥离注入 Java 对象的方法的信息,请参阅How to configure proguard for javascript interface?

【讨论】:

  • 我也面临同样的问题。但我正在调试模式而不是发布模式下尝试。因此在调试模式下未启用 proguard。 proguard如何剥离这个功能?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-14
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多