Xamarin.iOS NSHttpCookieStorage根据域名保存Cookies

上星期项目其中的一个模块在微信开发中做过一次了,经理说直接从微信端移植到app就可以了,于是涉及到了WebView展示微信网页的知识。大家应该都清楚webview展示网页的一些基本知识。以前也做过Android中的混合开发。但是这次和以前不太一样,需要在进入模块前通过微信授权拿到用户的UserId。接着需要我们调用接口登录,拿到Cookies。以后每个页面都需要携带登录时返回的Cookies。

于是根据这个流程去查阅了一些ios的资料,最终找到了它:NSHttpCookieStorage,NSHttpCookieStorage是单例的,可以根据域名来保存请求头部的信息。

接下来通过代码看一下,基本的流程。

微信授权就不说了,从拿到userId开始:


//下面这部分代码是当我们微信授权之后拿到了用户的OpenId后,
//调用接口去帮助用户登录我们自己的后台系统
var iServiceClient = new RestClient("http://登录接口域名/");
    var request = new RestRequest("登录接口", Method.GET);
    request.RequestFormat = DataFormat.Json;
    request.AddQueryParameter("UserId", "XXXX");
    var authResponse = iServiceClient.Get<AuthenticateResponse>(request);
if (authResponse != null && authResponse.Cookies.Count > 0)
    {
//set cookies
    List<NSHttpCookie> cookies = new List<NSHttpCookie>();

    string path = string.Empty;
    string domain = string.Empty;

    //循环保存登录时返回正常的几个cookies
    foreach (var sessionCookie in authResponse.Cookies)
    {
                   
        NSHttpCookieStorage.SharedStorage.AcceptPolicy = NSHttpCookieAcceptPolicy.Always;
        var cookieDict = new NSMutableDictionary();
        cookieDict.Add(NSHttpCookie.KeyName, new NSString(sessionCookie.Name));
        cookieDict.Add(NSHttpCookie.KeyValue, new NSString(sessionCookie.Value));
        cookieDict.Add(NSHttpCookie.KeyPath, new NSString(sessionCookie.Path));
        cookieDict.Add(NSHttpCookie.KeyDomain, new NSString(sessionCookie.Domain));
        path = sessionCookie.Path;
        domain = sessionCookie.Domain;

        cookies.Add(new NSHttpCookie(cookieDict));
     }
//将cookie设置到单例的网页请求中
     NSHttpCookieStorage.SharedStorage.SetCookies(cookies.ToArray(),
                                                             new NSUrl("http://域名/"),
                                                             new NSUrl("http://域名/"));
}



  设置完成之后在本界面或者其他界面调用时,只要是"http://登录接口域名/"

同一域名下的webview的NSMutableUrlRequest请求的头部都会携带刚才登录后获得的cookies了。


NSUrl path = new NSUrl("http://刚才的域名/登陆之后你要操作的网址");
NSMutableUrlRequest request = new NSMutableUrlRequest();
request.Url = path;
_webView.LoadRequest(request);
_webView.ScalesPageToFit = false;
_webView.ContentMode = UIViewContentMode.ScaleAspectFit;
_webView.BackgroundColor = MvxTouchColor.BackGray;
_webView.DataDetectorTypes = UIDataDetectorType.All;



  如上面所示,这时你请求的这个域名下的网址都会携带登录之后保存的cookies信息。


  如果不需要了还可以将cookies清除掉。


其实现在看看真的好简单,但是上周有两天的时间挂在这上面了,导致周末加班。

最终原因是在下面的网络请求时,和后台没有沟通好,除了cookie外还有一些数据没有传入。(蛋碎了一地啊!!!!)

希望大家一定吸取教训,不同工种协同好作业,否则太伤身了。


可能是对iOS一些平台的知识还不够了解,好多知识都是查iOS原生的解决方案,对着c代码去改c#(蛋好疼)。

因为现在项目比较紧张,目前的状态是拿到需求,根据需求去查阅资料。等闲下来了还是要主动去看看iOS平台相关的知识。

发现Xamarin开发方式还是非常接近的,基本上都是在调用原生的API,所以他的性能要比h5要高的多吧。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值