Xamarin跨平台iOS应用HybridWebView设置Cookie不生效问题求助
问题核心原因
你遇到的是iOS端WKWebView的经典Cookie同步问题:WKWebView不使用NSHttpCookieStorage.SharedStorage全局存储,而是使用自身独立的WKWebsiteDataStore管理Cookie,你之前的代码都是写到全局Cookie存储里,自然不会被WebView读取。
修复代码(修改HybridWebViewRenderer的OnElementChanged方法)
protected override void OnElementChanged(VisualElementChangedEventArgs e) { base.OnElementChanged(e); if (e.OldElement != null) { userController.RemoveAllUserScripts(); userController.RemoveScriptMessageHandler("invokeAction"); HybridWebView hybridWebView = e.OldElement as HybridWebView; hybridWebView.Cleanup(); } if (e.NewElement != null) { var targetUri = new System.Uri(((HybridWebView)Element).Uri); string cookieDomain = targetUri.Host; // 先清空WebView原有Cookie var dataStore = Configuration.WebsiteDataStore; var cookieTypes = new NSSet<NSString>(WKWebsiteDataType.Cookies); dataStore.RemoveDataOfTypes(cookieTypes, NSDate.FromTimeIntervalSince1970(0), () => { // 清空完成后再写入新Cookie var cookieDict = new NSMutableDictionary(); cookieDict.Add(NSHttpCookie.KeyDomain, new NSString("." + cookieDomain)); cookieDict.Add(NSHttpCookie.KeyName, new NSString("ABC")); cookieDict.Add(NSHttpCookie.KeyValue, new NSString("123e4567-e89b-12d3-a456-426652340003")); cookieDict.Add(NSHttpCookie.KeyPath, new NSString("/")); cookieDict.Add(NSHttpCookie.KeyExpires, DateTime.Now.AddDays(1).ToNSDate()); var myCookie = new NSHttpCookie(cookieDict); // 写入到WKWebView自己的Cookie存储 dataStore.HttpCookieStore.SetCookie(myCookie, () => { // Cookie写入完成后再发起请求,避免时序问题 var request = new NSMutableUrlRequest(new NSUrl(targetUri.AbsoluteUri)); LoadRequest(request); }); }); } }
注意事项
- 不需要再往
NSHttpCookieStorage.SharedStorage里写Cookie,写了也不会被WKWebView读取 - 必须等Cookie写入完成的回调触发后再调用
LoadRequest,避免请求发出去时Cookie还没写入成功 - 如果需要批量把
UserInfo.CookieContainer里的Cookie同步到WKWebView,循环转换为NSHttpCookie后依次写入HttpCookieStore即可 - 如果需要兼容iOS 10及更早版本,可以直接给请求头设置Cookie字段,示例如下:
var request = new NSMutableUrlRequest(new NSUrl(targetUri.AbsoluteUri)); request.Headers.SetValueForKey( new NSString("Cookie"), new NSString("ABC=123e4567-e89b-12d3-a456-426652340003; OtherCookie=xxx") ); LoadRequest(request);
内容的提问来源于stack exchange,提问作者garrow
相关产品推荐
相关产品推荐

