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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:45:03