iOS cookie manager

网上有很多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,避免服务端报错。

你可能感兴趣的:(iOS cookie manager)