You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin Android登录后获取当前Url及Office365登录后的Cookie

我之前踩过Android WebView和Office365登录结合获取Cookie的坑,刚好和你用的VS2017模拟器API25环境匹配,给你整理了一套亲测可行的方案:

解决Android WebView登录Office365后获取../login页面Cookie的方案

1. 先把WebView的基础配置做好

首先得确保WebView允许Cookie,并且开启JavaScript(毕竟Office365登录页面依赖JS),还要处理跨域Cookie的接受:

// 初始化Cookie管理器,允许接受Cookie
CookieManager cookieManager = CookieManager.Instance;
cookieManager.SetAcceptCookie(true);

// API21及以上需要开启第三方Cookie接受,Office365属于第三方域名,必须开
if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
{
    cookieManager.SetAcceptThirdPartyCookies(webView, true);
}

// 配置WebView的基础设置
WebSettings webSettings = webView.Settings;
webSettings.JavaScriptEnabled = true;
webSettings.DomStorageEnabled = true; // 有些登录场景需要DOM存储支持

2. 监听页面加载完成,精准捕获../login页面

登录完成后会重定向到../login,我们要在这个页面加载完成后再去拿Cookie,通过自定义WebViewClient的OnPageFinished方法来监听:

// 给WebView设置自定义的WebViewClient
webView.SetWebViewClient(new CustomWebViewClient());

// 自定义WebViewClient类
private class CustomWebViewClient : WebViewClient
{
    public override void OnPageFinished(WebView view, string url)
    {
        base.OnPageFinished(view, url);
        // 这里要注意:必须用../login对应的完整绝对URL来匹配,比如"https://your-domain.com/login"
        if (url.Equals("https://your-domain.com/login", StringComparison.OrdinalIgnoreCase))
        {
            // 页面加载完成,调用方法获取Cookie
            FetchLoginPageCookies(view, url);
        }
    }
}

3. 按目标URL获取Cookie(Android必须指定URL!)

Android的CookieManager不像iOS那样能全局拿,必须指定目标页面的完整URL才能拿到对应的Cookie,代码如下:

private void FetchLoginPageCookies(WebView view, string targetUrl)
{
    CookieManager cookieManager = CookieManager.Instance;
    // 获取目标URL的所有Cookie,格式是"key1=value1; key2=value2;"
    string rawCookies = cookieManager.GetCookie(targetUrl);
    
    if (!string.IsNullOrWhiteSpace(rawCookies))
    {
        // 把Cookie拆成键值对,方便后续使用
        Dictionary<string, string> cookieMap = new Dictionary<string, string>();
        foreach (string cookiePair in rawCookies.Split(';'))
        {
            string[] keyValue = cookiePair.Trim().Split('=');
            if (keyValue.Length == 2)
            {
                cookieMap[keyValue[0]] = keyValue[1];
            }
        }
        
        // 这里就可以用拿到的Cookie了,比如存到SharedPreferences或者传给后端接口
        foreach (var kvp in cookieMap)
        {
            Console.WriteLine($"Cookie项:{kvp.Key} = {kvp.Value}");
        }
    }
    else
    {
        Console.WriteLine("没拿到目标页面的Cookie,检查URL是否匹配或者WebView配置");
    }
}

4. 避坑小贴士

  • URL一定要用完整绝对路径:绝对不能用相对路径../login去匹配和获取Cookie,必须写全域名的URL,否则CookieManager找不到对应Cookie。
  • API25兼容性:Android 7.1(API25)不需要处理Cookie分区的复杂问题,但一定要确保第三方Cookie接受已经开启,不然Office365登录后的Cookie写不进来。
  • 测试前清理缓存:如果测试时出现Cookie异常,先清理WebView的缓存和旧Cookie,避免干扰:
    cookieManager.RemoveAllCookies(null);
    cookieManager.Flush();
    webView.ClearCache(true);
    

内容的提问来源于stack exchange,提问作者CSSguy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:42:14