如何在webview中为本地js文件启用cookie

How to enable cookie in webview for local js file?

本文关键字:js 文件 启用 cookie webview      更新时间:2023-09-26

我想在WebView中接受cookie,但是得到错误

Uncaught Error: SECURITY_ERR: DOM Exception 18

问题只发生在本地js文件中。正如Android文档所说,我必须使用setAcceptFileSchemeCookies

但这不能解决我的问题。我不知道我做错了什么。

整个代码列表:

protected override void OnCreate(Bundle bundle) {
        try {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.Main);
            _webView = FindViewById<WebView>(Resource.Id.webview);
            string html = string.Empty;
            Android.Webkit.CookieManager.SetAcceptFileSchemeCookies(true);               
            using (var stream = _webView.Context.Assets.Open("res/mobileLogin.html")) {
                using (TextReader reader = new StreamReader(stream)) {
                    html = reader.ReadToEnd();
                }
            }
            _webView.Settings.JavaScriptEnabled = true;
            _webView.Settings.AllowFileAccess = true;
            _webView.Settings.AllowUniversalAccessFromFileURLs = true;
            _webView.SetWebViewClient(new HybridWebViewClient());
            _webView.SetWebChromeClient(new WebChromeClient());
            _webView.LoadDataWithBaseURL("file:///android_asset/res/", html, "text/html", "UTF-8", null);
            Android.Webkit.CookieManager.Instance.SetAcceptCookie(true);
        } catch (Exception ex) {
            Console.WriteLine(ex.Message);
        }
    }

据我所知,在Android上将cookie主机设置为localhost会触发安全异常。如果您在远程主机上尝试相同的操作,它可能会工作。当然,这并不能解决你的问题。类似于:https://stackoverflow.com/a/24897724/368379这样的东西可以提供一个自己处理东西的起点,但与cookie不完全相同。

如果你选择JavascriptInterface,你可以在Xamarin中实现它。Android:

public class MyJavascriptInterface : Java.Lang.Object
{
    [Export("DoStuff")]
    [JavascriptInterface]
    public void DoStuff(string stuff)
    {
        // do something here with the string
    }
}
var webView = new WebView(this);
webView.Settings.JavaScriptEnabled = true;
var interface = new MyJavascriptInterface();
webView.AddJavascriptInterface(interface, "MyJavascriptInterface");

然后你可以在Javascript中像这样调用它:

MyJavascriptInterface.DoStuff("My Awesome String");