簡體   English   中英

Xamarin Android WebView對sessionStorage的訪問返回null

[英]Xamarin Android WebView access to sessionStorage returns null

我有這個自定義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));
        }
    }
}

我還從此處實現了一個自定義渲染器, 這里我附加了新的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 ,不僅用於存儲訪問。 這個問題必須更普遍。

我已經玩過了,並且找到了答案。

使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM