关闭应用程序时清除 Xamarin 表单 WebView cookie

Posted

技术标签:

【中文标题】关闭应用程序时清除 Xamarin 表单 WebView cookie【英文标题】:Xamarin forms WebView cookies cleared when app closed 【发布时间】:2022-01-09 14:50:09 【问题描述】:

我有适用于 android 的 Xamarin Forms WebView 应用程序。我可以在第一次登录时完美使用该应用程序。但是,如果我重新打开应用程序 WebView cookie 清除并且用户需要再次登录。 我希望用户在登录一次后不需要登录,即使他们关闭了应用程序。 这是我的代码:

 var wbURL = "https://www.example.com/login/";
 webrowser.Source = wbURL;

【问题讨论】:

我也为 Android 添加了一个可能的解决方案。您是否为 Webview 使用自定义渲染器?您是否在其中运行了一些可能会影响 cookie 持久性的代码? 在应用程序内,使用户可以注销,然后重新登录 - 无需关闭 web 视图或应用程序。这是为了验证它不是导致 cookie 失效的服务器。如果失败,那么它不是 webview - 它的服务器没有识别出 cookie 仍然有效。如果成功了,那么确实是 webview 或应用程序正在以某种方式丢弃它们,正如您目前所怀疑的那样。 【参考方案1】:

在 Android 上,cookie 应自动存储,除非您使用自定义渲染器手动删除它们。

对于 ios,您可以保存 cookie 并在以后恢复它们,如下所示:

保存cookies(用户登录后调用此方法,此代码放入WebView自定义渲染器):

public async Task SaveCookies()

    // For iOS < 10, cookies are saved in NSHTTPCookieStorage.sharedHTTPCookieStorage(), coojies should work withouth this
    if (!UIDevice.CurrentDevice.CheckSystemVersion(11, 0))
    
        return;
    

    try
    
        var cookies = await Configuration.WebsiteDataStore.HttpCookieStore.GetAllCookiesAsync();
        var cachedCookies = cookies.Select(c => new Cookie(c.Name, c.Value, c.Path, c.Domain)
            
                Secure = c.IsSecure,
                Version = Convert.ToInt32(c.Version)
            ).ToList();

            //TODO: Save the cachedCookies into app cache. You can create a service in the shared project
    
    catch (Exception e)
    
           
    

恢复cookies(在WebView自定义渲染器的OnElementChanged方法中调用这个):

var store = WKWebsiteDataStore.NonPersistentDataStore;
await RestoreCookies(store);

private async Task RestoreCookies(WKWebsiteDataStore store)

    // For iOS < 10, cookies are saved in NSHTTPCookieStorage.sharedHTTPCookieStorage(), coojies should work withouth this
    if (!UIDevice.CurrentDevice.CheckSystemVersion(11, 0))
    
        return;
    

    if (store == null)
    
        return;
    

    await ClearCookies(store);
    var storedCookies = //TODO: Retreive cookies from where you sotred them

    foreach (Cookie cookie in storedCookies)
    
        await store.HttpCookieStore.SetCookieAsync(new NSHttpCookie(cookie));
    


private async Task ClearCookies(WKWebsiteDataStore store)

    var cookies = await store.HttpCookieStore.GetAllCookiesAsync();
    if (cookies?.Any() ?? false)
    
        foreach (NSHttpCookie cookie in cookies)
        
            await store.HttpCookieStore.DeleteCookieAsync(cookie);
        
    

编辑: 如果您在 Android 上也遇到问题,请在您的 WebView 自定义渲染器中尝试以下代码:

 var cookieManager = CookieManager.Instance;
 cookieManager.SetAcceptCookie(true);
 cookieManager.AcceptCookie();
 cookieManager.Flush(); // Forces cookie sync

【讨论】:

注意:OP 说他们在 Android 上遇到了这个问题。我不熟悉 webview - 你有什么想法可能是错的吗?或者在关于 OP 可以提供的其他信息的问题中添加 cmets 以帮助弄清楚发生了什么? 哦,对了,我看错了。我确实使用过 WebViews,之前在 Android 上从未遇到过 cookie 持久性问题。我会用一些代码编辑帖子,谢谢!

以上是关于关闭应用程序时清除 Xamarin 表单 WebView cookie的主要内容,如果未能解决你的问题,请参考以下文章

使用 Xamarin 跨平台打开开始表单并关闭所有其他表单

Xamarin 表单:如何从 ios 捆绑签名中清除旧的分发证书和配置文件?

更新 Listview itemsource 在 Xamarin 表单中清除其中的单选按钮控件

当 API 关闭时,Xamarin 表单依赖注入 HttpClient 超时不起作用

WillEnterForeground 上的 Xamarin 表单更新 ListView

html 关闭时清除模态上的表单字段中的数据并清除验证消息