13

我正在开发一个报亭应用程序并使用NSURLRequest下载问题资产。

NSArray *contents = [issue.tableOfContents objectForKey:kSNTableOfContentsContents];
NSHTTPCookie *cookie;
NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSLog(@"HERE GO MY COOKIES");
for (cookie in [cookieJar cookies]) {
    NSLog(@"%@", cookie);
}            
for (NSDictionary *contentItem in contents) {
    NSString *contentURL_string = [contentItem objectForKey:kSNTableOfContentsRemoteURL];
    NSURL *contentURL = [NSURL URLWithString:contentURL_string];
    NSString *fileName = [contentItem objectForKey:kSNTableOfContentsContentsURL];      
    NSURLRequest *request = [[NSURLRequest alloc] initWithURL:contentURL];
    NKAssetDownload *asset = [newsstandIssue addAssetWithRequest:request];
    [request release];
    ....
    [asset downloadWithDelegate:self];
    ....
}

当执行第一个 for 循环时,我的 cookie 似乎在NSHTTPCookieStorage中,但是当发送实际请求时,标头中没有 cookie 信息。我使用CharlesProxy进行查找。任何人都可以提供一些建议可能导致这个问题吗?

4

2 回答 2

18

这个线程,神奇的咒语似乎是:

NSDictionary * headers = [NSHTTPCookie requestHeaderFieldsWithCookies:
  [cookieJar cookies]];
[request setAllHTTPHeaderFields:headers];

(警告:未经测试的代码。)

这会将您的 cookie jar 转换为一个 cookie 数组,然后转换为一个NSDictionary标头,最后将这些标头装订到您的请求中。正如 Adam Shiemke 在问题勘误表中所链接的那样,这与手动操作相当,但在我看来要干净得多。

根据文档,您可能还想检查HTTPShouldHandleCookies您的默认 cookie 策略是否被正确使用。

于 2012-04-06T05:11:02.597 回答
1

在 iOS 项目中,我发现 ASIHTTPRequest 对于此类问题非常有用。它比内置功能做得更好,比如身份验证和 cookie:http: //allseeing-i.com/ASIHTTPRequest/

于 2012-04-07T09:53:12.253 回答