网上有很多cookie的用法教程,站在巨人的肩膀上总结一下我对cookie的理解,和一些自己遇到的坑:
cookie的创建
方法一:
NSArray *a = [NSHTTPCookie cookiesWithResponseHeaderFields:@{@"Set-Cookie":@"username=qiandaojiang"} forURL:[NSURL URLWithString:@"http://"]];
方法二:
NSMutableDictionary *cookieProperties = [NSMutableDictionary dictionary];
[cookieProperties setObject:@"username" forKey:NSHTTPCookieName];
[cookieProperties setObject:@"qiandaojiang" forKey:NSHTTPCookieValue];
[cookieProperties setObject:@"baidu.com"forKey:NSHTTPCookieDomain]; //可不填
[cookieProperties setObject:@"baidu.com"forKey:NSHTTPCookieOriginURL]; //可不填
[cookieProperties setObject:@"/" forKey:NSHTTPCookiePath];
[cookieProperties setObject:@"0" forKey:NSHTTPCookieVersion];
NSHTTPCookie*cookie = [NSHTTPCookie cookieWithProperties:cookieProperties];
以上两种方式能都创建cookie,再使用NSHTTPCookieStorage
来管理全局的cookie
[cookieStorage setCookie:cookie];
cookie manager策略
NSHTTPCookieStorage
可以通过制定策略来配置从接收方接收cookie的优先级
typedef NS_ENUM(NSUInteger, NSHTTPCookieAcceptPolicy) {
NSHTTPCookieAcceptPolicyAlways,//总是接收
NSHTTPCookieAcceptPolicyNever,//不接收
NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain//只接收DomainURL的cookie
};
在我多次测试的情况下,使用NSHTTPCookieAcceptPolicyNever
本来的用意是不接收接收端设置的cookie,但是自己设置的cookie还是可以add上的,但是用上面cookie创建的方法一会有问题,你会发现你添加的cookie并没有添加成功,而是在Header中了!这就很尴尬了,相当于客户端添加的也拒绝了。这时候最规范的还是使用方法二,方法二还是不要用字典的 setObject
方法了,万一value为nil,会导致崩溃。
我现在的项目不能全局都设置成Never的策略,其他的模块需要用服务端的cookie,所以我只能遍历,删除相同name的cookie,避免服务端报错。