Android webview自定义JS无法从postMessage调用获取消息

时间:2015-09-01 20:44:50

标签: android android-webview

我使用带有护照的nodejs服务器来提供第三方认证。我在Anrdroid客户端上设置了一个WebView来加载以下html:

Android.callit('Loaded javascript file');

window.addEventListener('message', function(event) {
  Android.callit('got message event');

  authWindow.close();
}, false);

var authWindow = window.open("https://myserver/twitter/signin", "");

使用此javascript:

<html>
  <head>
    <script>window.opener.postMessage({"auth":true}, '*');</script>
  </head>
  <body>
  </body>
</html>

成功验证第三方服务器后,我的nodejs服务器重定向到这样的页面:

public class OAuthActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.oauth);

        WebView webView = (WebView) findViewById(R.id.webView);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        webView.addJavascriptInterface(new JSInterface(), "Android");
        webView.setWebViewClient(new WebViewClient() {
            public void onReceivedSslError(WebView webView, SslErrorHandler handler, SslError error) {
                handler.proceed();
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });

        webView.loadUrl("file:///android_asset/oauth.html");
    }

    public class JSInterface {
        @JavascriptInterface
        public void callit(String with) {
            Log.i("TEST", with);
        }
    }
}

这是启动webview的我的活动:

{{1}}

那么为什么“消息”事件永远不会被解雇?

作为一个注释,我在浏览器中完成了这项工作并且工作正常。当我尝试在Android webview中使用它时,就不行了。

1 个答案:

答案 0 :(得分:0)

如果您在上述JSON中添加转义字符,则上述代码会正常工作

window.opener.postMessage({\"auth\":true}, \"*\");