NSHTTPCookie
一個(gè)NSHTTPCookie對(duì)象就代表了一個(gè)HTTP cookie. cookie有兩個(gè)版本:
- Version 0: This version refers to “traditional” or “old-style” cookies, the original cookie format defined by Netscape. The majority of cookies encountered are in this format.
- Version 1: This version refers to cookies as defined in RFC 2965, HTTP State Management Mechanism.
我們可以通過NSHTTPCookie訪問cookie的各個(gè)屬性,它也提供了將HTTP cookie headers轉(zhuǎn)換為NSHTTPCookie實(shí)例對(duì)象以及將NSHTTPCookie對(duì)象轉(zhuǎn)化為對(duì)應(yīng)NSURLRequest請(qǐng)求頭的方法. URL loading system 會(huì)自動(dòng)的發(fā)送已存儲(chǔ)的對(duì)應(yīng)NSURLRequest的cookies. - 創(chuàng)建NSHTTPCookie:
NSMutableDictionary *properties = [NSMutableDictionary dictionary];
[properties setObject:key forKey:NSHTTPCookieName];
[properties setObject:newValue forKey:NSHTTPCookieValue];
[properties setObject:domian forKey:NSHTTPCookieDomain];
[properties setObject:path forKey:NSHTTPCookiePath];
NSHTTPCookie *cookieuser = [NSHTTPCookie
cookieWithProperties:properties];
有幾個(gè)key是必須要設(shè)置的: NSHTTPCookiePath, NSHTTPCookieName, NSHTTPCookieValue,還有就是NSHTTPCookieOriginURL 和 NSHTTPCookieDomain一定要選一個(gè).
NSHTTPCookieStorage
NSHTTPCookieStorage是一個(gè)單例,用來管理存儲(chǔ)的cookies.我們可以通過NSHTTPCookieStorage來設(shè)置cookie的接收策略,有三種模式: NSHTTPCookieAcceptPolicyAlways(默認(rèn)),
NSHTTPCookieAcceptPolicyNever,
NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain.
Cookies在iOS中是不能共享的,但在Mac OS是可以的(Session cookies 不能共享).在Mac OS app中更改cookie的接收策略會(huì)影響到其他正在運(yùn)行的在使用cookie storage的app.這時(shí)NSHTTPCookieStorage會(huì)發(fā)出兩個(gè)通知:NSHTTPCookieManagerCookiesChangedNotification 和 NSHTTPCookieStorageAcceptPolicyChangedNotification.
- NSHTTPCookieStorage 常用API
//獲取所有cookies
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
for (NSHTTPCookie *cookie in [cookieStorage cookies]) {
NSLog(@"%@", cookie);
}
//刪除cookies
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *tempArray = [NSArray arrayWithArray:[cookieStorage cookies]];
for (NSHTTPCookie *cookiej in tempArray) {
[cookieStorage deleteCookie:cookie];
}
//給指定的url設(shè)置cookies
-(void)addCookieToURL:(NSURL *)url key:(NSString *)key value:(NSString *)value{
NSString *newValue = (value != nil) ? value : @"";
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSMutableArray *cookies = [NSMutableArray arrayWithArray:[cookieStorage cookiesForURL:url]];
NSString *domian = [url host];
NSString *path = [url path];
NSMutableArray *tempCookies = [cookies copy];
for (NSHTTPCookie *cookie in tempCookies) {
if ([cookie.name isEqualToString:key]) {
[cookies removeObject:cookie];
}
}
NSMutableDictionary *properties = [NSMutableDictionary dictionary];
[properties setObject:key forKey:NSHTTPCookieName];
[properties setObject:newValue forKey:NSHTTPCookieValue];
[properties setObject:domian forKey:NSHTTPCookieDomain];
[properties setObject:path forKey:NSHTTPCookiePath];
NSHTTPCookie *cookieuser = [NSHTTPCookie cookieWithProperties:properties];
[cookies addObject:cookieuser];
/*The cookies will replace existing cookies with the same name, domain, and path, if one exists in the cookie storage. The cookie will be ignored if the receiver's cookie accept policy is NSHTTPCookieAcceptPolicyNever.
To store cookies from a set of response headers, an application can use cookiesWithResponseHeaderFields:forURL: passing a header field dictionary and then use this method to store the resulting cookies in accordance with the receiver’s cookie acceptance policy.
*/
//- (void)setCookie:(NSHTTPCookie *)aCookie
[cookieStorage setCookies:cookies forURL:url mainDocumentURL:nil];
}