【问题标题】:NSURLRequest / NSURLConnection ios 5.0 v/s earlier versionsNSURLRequest / NSURLConnection ios 5.0 v/s 早期版本
【发布时间】:2011-09-02 10:10:17
【问题描述】:

我正在尝试使用 NSMutableRequest 和 NSURLConnection 从服务器获取压缩文件。这是我正在使用的代码:

NSMutableURLRequest *newRequest = [NSMutableURLRequest requestWithURL:downloadUrl
                                                                  cachePolicy:NSURLRequestReloadIgnoringCacheData
                                                          timeoutInterval:30.0];


[newRequest setValue:@"Y29tLm5vbWFkZ......" forHTTPHeaderField:@"Authorization"];
NSURLConnection *connection = [NSURLConnection connectionWithRequest:newRequest delegate:self];
if (!connection) {
        [self handleDownloadError];
}   

我使用的是相同的 NSURLConnectionDelegate 方法

didReceiveResponse, didReceiveData, connectionDidFinishLoading, didFailWithError

但是,当我在 ios 4.3 或更早版本(它会下载压缩文件)和 ios 5.0(返回一个显示“身份验证失败”的 JSON)中运行此代码时,我得到了不同的响应。

ios 5.0 为 NSURLConnectionDelegate 引入了许多新方法。但我不确定这是否是关于 ios 5.0 更改 api 的问题,还是服务器代码以不同方式处理相同请求。有谁知道可能是什么问题?

【问题讨论】:

  • 没有人可以帮助您解决这个问题,因为 iOS5 仍然在保密协议中。您可能想试试 Apple 开发者论坛。
  • 我不确定问题是由于 ios 5 的更改还是服务器问题。还是谢谢
  • 您需要检查从您的模拟器在 ios4.3 和 ios5 上发送的确切 HTTP 标头。如果它们相同,则服务器有责任停止对设备进行不同的处理。

标签: objective-c ios nsurlconnection ios5


【解决方案1】:

iOS5 改变了 HTTP 标头的大写方式,至少从末尾删除了空格。通过将它们打印到控制台来验证您收到的实际 HTTP 标头:

- (void)connection:(NSURLConnection *)aConnection
  didReceiveResponse:(NSURLResponse *)aResponse
{
  NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)aResponse;
  NSLog(@"Response headers :%@", [httpResponse allHeaderFields]);
}

顺便说一句,您是否注意到您列出的那些方法在 Apple iOS Developer Library docs for NSURLConnection 上被标记为“在 iOS 2.0 到 iOS 4.3 中可用”?

【讨论】:

  • 您的委托应该遵守一个尚未记录的协议:NSURLConnectionDataDelegate。它在标题中,但尚未记录在案。似乎他们已经完成了将这种非正式协议转换为正式协议的一半。所有相同的方法都在那里,只是定义不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多