Xamarin Android登录后获取当前Url及Office365登录后的Cookie
我之前踩过Android WebView和Office365登录结合获取Cookie的坑,刚好和你用的VS2017模拟器API25环境匹配,给你整理了一套亲测可行的方案:
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
相关产品推荐
相关产品推荐

