Xamarin Android WebView对sessionStorage的访问返回null

时间:2018-07-12 15:35:03

标签: c# xamarin xamarin.forms android-webview

我有这个自定义WebViewClient,每当页面完成加载时,我都想使用JavaScript注入来检查sessionStorage的值以读取存储。

问题在于callbackobj的值始终为(null)。我在做什么错了?

public class CustomWebViewClient : WebViewClient
{

    public override void OnPageFinished(WebView view, string url)
    {
        string script = "window.sessionStorage.getItem('someKey');";
        var callbackobj = InjectJS(view, script);

        base.OnPageFinished(view, url);
    }

    private JsValue InjectJS(WebView view, string script)
    {
        var valueCallback = new JsValue();
        view.EvaluateJavascript(script, valueCallback);

        return valueCallback;

    }
    public class JsValue : Java.Lang.Object, IValueCallback
    {
        public string Value { get; set; }
        public void OnReceiveValue(Java.Lang.Object value)
        {
            this.Value = value.ToString() ?? throw new ArgumentNullException(nameof(value));
        }
    }
}

我还从here实现了自定义渲染器,并在其中附加了新的CustomWebClient。

protected override void OnElementChanged(ElementChangedEventArgs<HybridWebView> e)
    {
        base.OnElementChanged(e);

        if (Control == null)
        {
            var webView = new Android.Webkit.WebView(_context);
            webView.SetWebViewClient(new CustomWebViewClient());

            webView.Settings.JavaScriptEnabled = true;
            webView.Settings.DomStorageEnabled = true;
            SetNativeControl(webView);
        }
        if (e.OldElement != null)
        {
            Control.RemoveJavascriptInterface("jsBridge");
            var hybridWebView = e.OldElement as HybridWebView;
            hybridWebView.Cleanup();
        }
        if (e.NewElement != null)
        {
            Control.AddJavascriptInterface(new JSBridge(this), "jsBridge");
            Control.LoadUrl(Element.Uri);

        }
    }

编辑:它甚至不能与简单的脚本一起使用,因为返回document.body不仅可以访问存储。这个问题必须更普遍。

1 个答案:

答案 0 :(得分:0)

我玩过它,我想通了。

使用EvaluateJavaScript时不需要jsBridge。

当脚本更改为

string script = "javascript:(function() { return sessionStorage.getItem('someKey'); })()

有效。

我也将转换设置为:

public void OnReceiveValue(Java.Lang.Object value)
{
 this.Value = ((Java.Lang.String)value).ToString() ?? throw new ArgumentNullException(nameof(value));
}

编辑:如果在这种情况下我还需要等待JS执行,则此答案完成了工作https://forums.xamarin.com/discussion/comment/283373/#Comment_283373