更新:显然在iOS 5上的问题是“Chunked-Encoding”,当没有发送时,一切正常。似乎在服务器上由于某种原因在iOS 5上传输永远不会结束(在iOS 6上一切正常)。任何人都可以解决这个问题?
我正在使用NSURLConnection,它在iOS 6和同一版本的模拟器上运行良好,但在早期设备上进行测试时,我只得到响应
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
从不与
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
假设包含我的相关数据。
以下是我使用的所有函数的代码片段(我看到有些人删除了一些委托函数解决了类似的问题,但在我的情况下我没有它们):
-(void)establishConnection{
NSURL *url;
url = .... // Here I've set my url - it's https
self.responseData = [[NSMutableData alloc] initWithLength:0] ;
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:SERVER_RESPONSE_TIMEOUT];
[request setHTTPMethod:@"POST"];
// More settings here //
....
//Accept-Language: ENUS
[request addValue:@"ENUS" forHTTPHeaderField:@"Accept-Language"];
// "Accept-Topic: Dictation"
[request addValue:@"Dictation" forHTTPHeaderField:@"Accept-Topic"];
// "Accept: text/plain"
[request addValue:@"text/plain" forHTTPHeaderField:@"Accept"];
//"Transfer-Encoding: chunked"
[request addValue:@"chunked" forHTTPHeaderField:@"Transfer-Encoding"];
NSMutableData *postBody = [NSMutableData data];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [NSString stringWithFormat:@"%@",[paths objectAtIndex:0]]; // Get sound directory
NSData *soundData = [NSData dataWithContentsOfFile: [NSString stringWithFormat:@"%@/%@",documentsDirectory, @"rec.wav"]];
[postBody appendData:soundData];
[postBody appendData:[@"\r\n" dataUsingEncoding: NSUTF8StringEncoding]];
// final boundary
//[postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
// add body to post
[request setHTTPBody:postBody];
self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
// You may have received an HTTP 200 here, or not...
NSLog(@"didReceiveResponse");
}
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
NSString* aStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSLog(@"This is my first chunk %@", aStr);
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connectionV {
connectionV = nil;
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
NSLog(@"Something went wrong...");
}
请帮助我找不到我做错了什么。
答案 0 :(得分:0)
您不应该自己设置转码编码。 NSURLConnection
会在适当的时候为您设置。
基本上,HTTP消息需要Content-Length标头集,或者它使用分块传输编码,其中不必设置Content-Length标头。
当您通过请求的属性HTTPBodyStream
将正文数据设置为流并且未明确指定Content-Length时,NSURLConnection
将自动使用分块传输编码和基础当身体数据在流的状态(检测到EOF)上完成时的决定。
否则,如果您通过属性HTTPBody
使用NSData
对象设置正文数据,则可以明确设置Content-Length,或者让NSURLConnection
为您设置,基于NSData
对象的长度。在这种情况下,您不会获得分块传输编码。
否则,如果您将正文数据设置为流(例如,您创建为文件流的NSInputStream
)并明确设置Content-Length标头,NSURLConnection
将不会使用分块传输编码
如果可能,请为NSInputStream
设置内容长度,即您事先能够知道身体的大小。可能有服务器有麻烦或者根本无法解析通过分块传输编码传输的数据,例如,当您发送JSON或XML数据时,Rails具有像WEBrick这样的“简单服务器”。否则,Web服务器无论如何都将缓冲所有输入数据。