Android WebView XHR请求返回新Cookie未持久化 Xamarin.Forms适配问题
问题根因
该问题是Android平台WebView的特有行为,与Xamarin.Forms框架无关:
- iOS端WKWebView默认会自动将内存中的Cookie异步同步到持久化存储,不会出现该问题
- Android端CookieManager默认仅在触发全量页面导航时,才会将内存中存储的Cookie写入磁盘持久化;XHR等异步请求返回的
Set-Cookie响应头仅会将Cookie存在内存中,未触发持久化写入的前提下,重启应用后内存数据释放,Cookie自然丢失。你观察到的全量重载页面后Cookie正常持久化,正是因为页面导航触发了CookieManager的持久化刷入逻辑。
解决方案
方案1:Android原生端主动触发Cookie持久化(推荐,无前端改动)
在Android项目中做如下修改即可:
- 打开Android项目的
MainActivity.cs文件,添加CookieManager配置,以及退后台主动刷入持久化的逻辑,代码示例如下:
using Android.Webkit; protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); Xamarin.Essentials.Platform.Init(this, savedInstanceState); // 初始化Cookie配置,放在LoadApplication之前 CookieManager.Instance.SetAcceptCookie(true); // 如果WebView加载的域名和应用主域名不同,需要开启第三方Cookie接受 // CookieManager.Instance.SetAcceptThirdPartyCookies(wv, true); LoadApplication(new App()); } // 重写应用退后台方法,主动将内存Cookie刷入磁盘 protected override void OnStop() { base.OnStop(); if (Android.OS.Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.Lollipop) { CookieManager.Instance?.Flush(); } }
- 如果你希望Cookie写入更及时,也可以自定义Android端WebView渲染器,重写
WebViewClient的OnPageFinished方法,每次页面加载完成后主动调用一次CookieManager.Instance.Flush()即可。
方案2:前端SPA侧适配(无需改动原生代码)
在SPA的登录逻辑中,XHR请求登录成功后,主动调用一次location.reload()触发页面全量重载,即可触发Android WebView的Cookie持久化逻辑,和你手动重载页面的效果一致。该方案缺点是会有一次页面刷新的体验损耗。
注意事项
确认后端返回的持久化Cookie配置正确,必须带有Expires或者Max-Age属性,否则会默认作为会话Cookie处理,本身就不会被持久化存储。
内容的提问来源于stack exchange,提问作者Jaap Mosselman
相关产品推荐
相关产品推荐

