Xamarin WKWebView 和 Cookie

2023-11-30

我有一个 Xamarin Forms 应用程序,它使用 cookie 来跟踪登录状态并同时使用 HTTPRequest 和 Webview,因此两者都需要共享 cookie。对于 UIWebView,这些 cookie 是共享的,无需我进行任何额外的管理;对于 WKWebView,情况似乎并非如此。我一直在寻找有关如何使用 WKWebView 处理 cookie 的解释或如何在这两个对象之间手动检索和设置 cookie 的示例,但无法找到任何内容。如何获取在使用 UIWebView 和 WKWebView 时所依赖的 cookie 行为?


当我尝试实现 WKNamvigationDelegate 时,未调用 WebView OnLoadFinished,因此加载完成后我的加载指示器仍然存在。最终对我有用的是在我的 iOS CustomWebViewRenderer 的构造函数中,我调用此函数来清除任何现有的 cookie 并将任何 cookie 从 HTTP 共享存储复制到 web 视图中:

protected async void SetCookies()
{
    var dataStore = WKWebsiteDataStore.DefaultDataStore;
    var cookies = NSHttpCookieStorage.SharedStorage.Cookies;
    var oldcookies = await dataStore.HttpCookieStore.GetAllCookiesAsync();
    foreach (var cookie in oldcookies)
    {
        await dataStore.HttpCookieStore.DeleteCookieAsync(cookie);
    }
    foreach (var cookie in cookies)
    {
        await dataStore.HttpCookieStore.SetCookieAsync(cookie);
    }
} 

为了从 webview 获取 cookie,我在共享代码中存在一个 CustomWebView,它使用 OnShouldLoad 来检测成功登录的指示,然后调用平台特定的代码。这是为了处理 Android cookie 而创建的,但现在也适用于 iOS。 iOS 实现清除任何现有的 HTTP 共享存储 cookie,并将 cookie 从 webview 复制到共享存储中。

public async Task GetCookiesFromWebview()
{
    var dataStore = WKWebsiteDataStore.DefaultDataStore;
    var cookies = await dataStore.HttpCookieStore.GetAllCookiesAsync();
    var oldcookies = NSHttpCookieStorage.SharedStorage.Cookies;
    foreach (var cookie in oldcookies)
    {
        NSHttpCookieStorage.SharedStorage.DeleteCookie(cookie);
    }
    foreach (var cookie in cookies)
    {
        NSHttpCookieStorage.SharedStorage.SetCookie(cookie);
    }
    return;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xamarin WKWebView 和 Cookie 的相关文章

随机推荐

  • 在运行单元测试之前复制到 teamcity 的 out 目录

    所以我的情况是我终于完成了TeamCity的CI配置 我做到了在一些友好的帮助下运行我的单元测试 然而 许多单元测试都会失败 因为一旦构建并准备好运行 就需要在unittests dll旁边有一个配置文件 我写了一个简单的Command L
  • Dataproc YARN 容器日志位置

    我知道这个线程的存在 各个 dataproc Spark 日志在哪里 However if i ssh connect to a worker node vm and navigate to the tmp folder this is a
  • 如何在Golang中访问嵌套的Json键值

    团队 编程新手 解组 Json 后 我有可用的数据 如下所示 其中包含嵌套的 Key 值 我能够访问的平面键值 如何访问嵌套键值 这是解组后的字节切片数据 如下所示 gt tables map name basic snatpool mem
  • Bootstrap .popover('show')、.popover('hide') 不起作用。将其绑定到点击作品

    我有一个已绑定到弹出框的按钮 当有人单击弹出窗口中的表情符号之一时 我想隐藏弹出窗口 然而 smiley popover hide 不起作用 不幸的是 我无法用准系统代码重现这一点 它只发生在实时站点上 即https coinchat or
  • 作为不同用户的 RPM %post

    我需要在 RPM 的 post 部分中以不同用户身份运行命令 目前我正在通过 python 使用一些 hack 但这不是最好的方法 它确实感觉有点脏 post p usr bin python import os pwd subproces
  • 将一个向量中的每个元素与第二个向量中的每个元素相加

    我想将一个向量中的每个元素与另一个向量中的每个元素相加 如下所示 but避免 for 循环 有没有简单的方法呢 vadd lt function vrow vcol vmatrix lt matrix nrow length vrow nc
  • 静态内容不能引用非静态方法

    我无法编译以下代码 public class Test public static void main String args int a calcArea 7 12 System out println a int calcArea in
  • 如何使用斯坦福解析器将文本拆分为句子?

    如何使用将文本或段落拆分为句子斯坦福解析器 有没有什么方法可以提取句子 比如getSentencesFromString 因为它是规定的Ruby 您可以检查 DocumentPreprocessor 类 下面是一个简短的片段 我认为可能还有
  • 遇到 0 时按组重置的 Cumsum

    下面是我的数据框 我想得到 是 列 我似乎无法理解cumsum当它根据 id 的 值 字段达到 0 时重置 还有其他类似的问题 但解决方案不适用于我的实际数据集 test lt data frame id c 1 1 1 1 2 2 2 2
  • 如何在具有2000万行数据集的MySQL中删除重复项?

    我有一个很大的 MySQL 数据库 我需要快速删除重复的项目 它看起来是这样的 id text1 text2 1 23 43 2 23 44 3 23 44 删除后 表的剩余部分应为 id text1 text2 1 23 43 3 23
  • 将数组存储在共享首选项中

    我有一个Array具有整数值 它会随着时间的推移而增长 它大约有最多 50 个值 我想将数组持久存储 因此我考虑将其存储在SharedPreferences 我知道其中不能存储复杂类型 但我也听说要序列化Array然后将其存储在Shared
  • 如何在使用 Electron-builder 构建 exe 后运行“sqlite3”

    我在以下人员的帮助下构建了我的电子应用程序https medium com jspoint packaging and distributing electron applications using electron builder 31
  • DOMPDF 中的自定义宽度和高度

    无论如何 我可以设置生成的 PDF 的宽度和高度吗 我想自定义PDF的宽度和高度 通常它会采用短铜版纸的尺寸 但我如何定制它 举例来说 我希望它的大小为 200 x 500 像素 任何想法将不胜感激 干杯 您可以通过在调用 DOMPDF s
  • Magento - 列出产品类别

    在 Magento 的每个产品详细信息页面上 我想列出属于哪些类别 我将如何实现这一目标 尝试一下 currentCatIds product gt getCategoryIds and also categoryCollection Ma
  • 在 primefaces 中绑定文件下载参数

    我想在 primefaces 中下载一个名称可能不同的文件 这是控制器的代码 ManagedBean name fileDownloadController eager true ViewScoped public class FileDo
  • 如何在不刷新整个页面的情况下重新加载DIV内容

    我只想用我得到的内容替换 DIV 内容 当我使用ajax向服务器发出get请求后 ajax type GET url http 127 0 0 1 8000 result age ageData occasion occasionData
  • 如何在仅支持常量表达式的函数中使用变量作为参数

    我正在使用这个功能 delay cycles var 我收到以下错误 论证到 delay cycles必须是常量表达式 很公平 但我怎样才能绕过这个呢 我每次都必须以不同的值延迟我的程序 我从 RS232 接收数据并将其存储在一个int多变
  • Python lambda函数下划线冒号语法解释?

    在以下 Python 脚本中 其中 aDict 是字典 0 在 lambda 函数中起什么作用 sorted aDict items key lambda 0 让我们把它分开 1 假设你有一个字典 di di one 1 two 2 thr
  • 如何判断会话是否处于活动状态? [复制]

    这个问题在这里已经有答案了 根据请求 您可以通过几种不同的方式来判断会话是否已启动 例如 isSessionActive session id Or isSessionActive defined SID 然而 如果您启动一个会话然后关闭它
  • Xamarin WKWebView 和 Cookie

    我有一个 Xamarin Forms 应用程序 它使用 cookie 来跟踪登录状态并同时使用 HTTPRequest 和 Webview 因此两者都需要共享 cookie 对于 UIWebView 这些 cookie 是共享的 无需我进行