我有这个自定义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
不仅可以访问存储。这个问题必须更普遍。
答案 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