[英]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.