Внедрение Javascript в WebView не работает в плагине Cordova

Я пытаюсь разработать плагин Cordova, который может внедрить внешний JavaScript в CordovaWebView. Но я не могу добиться успеха.

Я попробовал то же самое в MainActivity, которая расширяет CordovaActivity, работает нормально.

Вот что я сделал.

Класс WebAppInterface

private class WebAppInterface {

    private final Context context;

    WebAppInterface(Context context) {
        this.context = context;
    }

    @JavascriptInterface
    public void showToast(String toastMsg) {
        Toast.makeText(context, toastMsg, Toast.LENGTH_SHORT).show();
    }
}

Код впрыска

    WebSettings webSettings = ((WebView)appView.getEngine.getView()).getSettings();
    webSettings.setJavaScriptEnabled(true);

    myWebView.addJavascriptInterface(new WebAppInterface(webView.getContext()), "android");

    myWebView.loadUrl("javascript:android.showToast('Toast 1')");

Подходя к кордовой, я сделал плагин MyPlugin, расширяющий CordovaPlugin, и метод overided execute.

@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {

    if ("showLog".equals(action)) {
        Log.d("showLog", "showLog");
        return true;
    }

    if ("showToast".equals(action)) {

        cordova.getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {

                WebView webView = (WebView) UnfoldPlugin.this.webView.getEngine().getView();
                webView.getSettings().setJavaScriptEnabled(true);
                webView.addJavascriptInterface(new WebAppInterface(webView.getContext()), "android");

                webView.loadUrl("javascript:android.showToast('Hello World')");
            }
        });

        return true;
    }

    return false;
}

Я также написал UnfoldPlugin.js, вызвав метод cordova.exec. Оба действия "showLog" и "showToast" вызываются, но не в состоянии преуспеть в получении тоста посредством внедрения javascript.

Это проблема Cordova, которая не позволяет вводить внешний javascript через плагин?

Как мне решить эту проблему? Помогите.

редактировать

Однако javascript:window.alert("Hello World") работает

    @Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {

    if ("showToast".equals(action)) {

        cordova.getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                webView.loadUrl("javascript:window.alert('Hello World')");
            }
        });
        callbackContext.success();
        return true;
    }

Я думаю, что addJavascriptInterface не работает с плагином Cordova.

1 ответ

После нескольких часов исследований я нашел ответ. Надеюсь, это может кому-то помочь.

Метод addJavascriptInterface должен вызываться внутри инициализации.

    public void initialize(CordovaInterface cordova, CordovaWebView webView) {
        super.initialize(cordova, webView);
        WebView webView = (WebView) UnfoldPlugin.this.webView.getEngine().getView();
        webView.getSettings().setJavaScriptEnabled(true);
        webView.addJavascriptInterface(new WebAppInterface(webView.getContext()), "android");
    }

Затем можно использовать webView.loadUrl() с любым тегом javascript.

Другие вопросы по тегам