在Xamarin中为WebView设置Cookie

5
我在我的Xamarin项目中有以下计划:
  • 用户在MainPage上输入用户名和密码。
  • 如果数据正确(API存在),则导航到WebView并自动登录用户。

现有的API(非公开)提供了一个System.Net.CookieCollection。

我如何使用这些cookie实现我的想法,使用POST请求?以下是我的基础:

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class WebPage : ContentPage
{
    public WebPage(string url, CookieCollection cookies)
    {
        InitializeComponent();
        BindingContext = new MainPageViewModel();
        MyWebView.Source = "https://" + url;

    }
}

亲切的问候, localhorst27
1个回答

6
你需要为Android和iOS的WebView创建自定义渲染器。这样,你就能够将cookie注入到Android的WebView和iOS的UIWebView中。如果你对它们不熟悉,请从这里开始:自定义渲染器介绍 当你熟悉了渲染器的工作原理后,可以参考Christine Blanda在Xamarin论坛上的文章:在WebView中设置Cookie 我也会在这里发布代码,以确保它在原始帖子无法访问时得以保存。 Android OnElementChanged
var cookieManager = CookieManager.Instance;
cookieManager.SetAcceptCookie(true);
cookieManager.RemoveAllCookie();
var cookies = UserInfo.CookieContainer.GetCookies(new System.Uri(AppInfo.URL_BASE));
for (var i = 0; i < cookies.Count; i++)
{
    string cookieValue = cookies[i].Value;
    string cookieDomain = cookies[i].Domain;
    string cookieName = cookies[i].Name;
    cookieManager.SetCookie(cookieDomain, cookieName + "=" + cookieValue);
}

iOS OnElementChanged

// Set cookies here
var cookieUrl = new Uri(AppInfo.URL_BASE);
var cookieJar = NSHttpCookieStorage.SharedStorage;
cookieJar.AcceptPolicy = NSHttpCookieAcceptPolicy.Always;
foreach (var aCookie in cookieJar.Cookies)
{
    cookieJar.DeleteCookie(aCookie);
}

var jCookies = UserInfo.CookieContainer.GetCookies(cookieUrl);
IList<NSHttpCookie> eCookies = 
                   (from object jCookie in jCookies 
                    where jCookie != null 
                    select (Cookie) jCookie 
                    into netCookie select new NSHttpCookie(netCookie)).ToList();
cookieJar.SetCookies(eCookies.ToArray(), cookieUrl, cookieUrl);

CookieManager没有名为Instance的属性。你能解释一下它可能如何工作吗?另外,我的编译器无法处理AppInfo.URL_BASE。 - localhorst27
论坛上的链接提供了一些关键信息。最终,我使用了这里提供的一些代码,但是为了全面理解,还是要去论坛查看。这个方法行得通。 - CaptainBli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接