【问题标题】:How do I access cookies in a Xamarin WebView?如何访问 Xamarin WebView 中的 cookie?
【发布时间】:2016-12-17 22:29:57
【问题描述】:

在我们的 Xamarin 应用中,我们需要允许我们的用户使用他们自己的 SSO 解决方案登录。

这在我们的 iOS 应用程序中的工作方式是,我们打开一个带有 web 视图的控制器并将其指向我们的网站,并继续观察 cookie,直到它们返回我们的网站,cookie 表明它们“重新登录。但在 Xamarin 中,我看不到如何访问 WebView 的 cookie。我们的 Xamarin 应用在 Windows 8.1 和 WinPhone 8.1 上运行,但它会在某个时候扩展到 Android,所以我需要一个跨平台的解决方案。

那么,如何在 Xamarin WebView 中访问 c​​ookie?

【问题讨论】:

    标签: c# xamarin.forms xamarin.windows xamarin.winphone


    【解决方案1】:

    您需要在 PCL 项目中创建自定义控件,然后为每个平台添加自定义 web 视图。然后平台特定的实现会获取 coockies,您可以从您的 pcl-webview 中使用它。

    在 Android 上,您可以使用以下代码获取 cookie:

    var cookieHeader = CookieManager.Instance.GetCookie(url);
    

    在 iOS 上:

    NSHttpCookieStorage storage = NSHttpCookieStorage.SharedStorage;
    

    github上的源码:https://github.com/seansparkman/CookiesWebView

    【讨论】:

    • 谢谢。该项目已有 2 年多的历史,针对 Xamarin 1.4 并且不包含 Windows 平台。您知道适用于 Windows 8.1 和 Xamarin 2.0 的解决方案吗?
    • 我们使用 Xamarin.Forms 2.1.0.6529,它就像一个魅力(ios 和 android)。我们只是复制了项目所需的部分。 github-link 只是显示,如何解决这个问题。对于 Windows,您需要查看 WinPhone 代码并尝试采用它。
    【解决方案2】:

    每个移动平台中 Cookie 的优点在于它们是跨应用程序共享的 Cookie 容器。 WebView 不保存平台所保存的 Cookie,因此即使是 HTTP 调用和不同的 WebView 都可以访问相同的共享 cookie 容器。

    但是,从某些平台中撤出它们可能会很棘手,因为需要进行反思。如果您的 SSO 解决方案只要求他们先访问网页进行登录,那么无论如何他们都共享相同的 cookie,您无需执行任何此操作。

    安卓

    Android 有 2 个用于 HTTP 和 WebView 的独立 cookie 容器。它是奇怪的一个。因此你有

        using System.Net.Http;
    
        private static CookieContainer _cookieContainer = new System.Net.CookieContainer();
        private static Android.Webkit.CookieManager _cookieManager = Android.Webkit.CookieManager.Instance;
    

    使用 HTTP 请求,您可以这样做

    HttpClient client = new HttpClient(new HttpClientHandler() { CookieContainer = cookieContainer });
    

    WebView 使用另一个,您可以在每个容器中获取和设置 cookie。

    iOS

    这个很简单,都存放在里面

     NSHttpCookieStorage.SharedStorage.Cookies
    

    WinRT

    using Windows.Web.Http;  //NOT: Microsoft.Net.Http
    
    var filter = new HttpBaseProtocolFilter();
    HttpClient client = new HttpClient(filter);
    
    // Use this, while it comes from an instance, its shared across everything.
    filter.CookieManager
    

    【讨论】:

      猜你喜欢
      • 2020-11-04
      • 2017-08-08
      • 2019-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 2018-10-07
      相关资源
      最近更新 更多