在Android WebView for SDK 24+中使用LoadUrl注入javascript失败

时间:2017-06-26 17:53:01

标签: javascript android xamarin webview xamarin.android

我正在尝试使用从App到Android WebView的函数注入javascript命名空间

注意:除了以下脚本之外,我对WebView上加载的实际源没有任何控制权。我在Xamarin工作,所以Android代码是C#

因此我使用了两个主要组件:

(function() {
    console.log("Loading JS Bindings");
    function addOnClickHandler () {
        $(document).ready(function () {
            if (window.InjectedNamespace) { // check InjectedNamespace namespace exists
                var onClickHandler = window.InjectedNamespace.handleOnClick;
                if (typeof onClickHandler === 'function') {
                    $(":button, a").each(function (idx) {
                        $(this).click(function() {
                            onClickHandler("click!");
                        });
                    });
                } else {
                    console.error('missing onclick handler');
                }
            } else {
                console.error('missing InjectedNamespace namespace');
            }
        });
    }
})();
  1. 以上脚本将由第三方添加,将click功能附加到所有<button><a>标记。

  2. 下面的命名空间将从App端注入

  3. var InjectedNamespace={handleOnClick:function(a){Internal.handleOnClickEvent(a)}};

    在App方面,我有这个Javascript界面​​对象

    class JSInterfaceObject : Java.Lang.Object
        {
          readonly CustomWebView View;
          string Data;
    
          public JSInterfaceObject(CustomWebView view)
          {
            View = view;
          }
    
          [Export]
          [JavascriptInterface]
          // only methods exposed with annotation [JavascriptInterface] are exposed to javascript
          public void handleOnClickEvent(string data)
          {
            Log.ForContext("TAG", TAG).Debug("handleOnClickEvent: " + data);
            if(View.OnClick != null)
            {
              View.OnClick(data);
            }
          }
        }
    

    此界面使用

    添加到webview

    AddJavascriptInterface(new JSInterfaceObject(this), "Internal");

    OnPageStarted我正在使用

    注入javascript

    webview.LoadUrl("javascript:"+"var IM={handleOnClick:function(a){Internal.handleOnClickEvent(a)}};");

    此设置适用于Android SDK&lt; 24.但是对于SDK中的Webview&gt; = 24,脚本始终会错误地显示missing InjectedNamespace namespace,这意味着LoadUrl中的OnPageStarted失败了!

    此检查在脚本中的$(document).ready中完成。

    我在“Android 7.0 for Developers”中找到了这个说明

      

    “从定位到Android 7.0的应用开始,Javascript上下文将会出现   加载新页面时重置。目前,背景是进行的   在新的WebView实例中加载的第一页。

         

    希望将Javascript注入WebView的开发人员应该   在页面开始加载后执行脚本。“

    因此尝试在页面开始加载后添加javascript注入代码但得到了相同的错误。还尝试使用WebView.EvaluateJavascript(),但错误仍然存​​在。

    如果我将TargetSDK更改为&lt; = 23。

    ,则错误消失

0 个答案:

没有答案