1

ОБНОВЛЕНИЕ: По-видимому, на iOS 5 проблема заключается в «Chunked-Encoding», при отправке без этого все работает. Кажется на сервере, что по какой-то причине на iOS 5 передача никогда не заканчивается (на iOS 6 все работает). У кого-то есть способ обойти это?Использование NSURLConnection с iOS 5 не работает должным образом


Я использую 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..."); 

} 

Пожалуйста, помогите, я не могу найти, что я делаю неправильно.

+1

Получаете ли вы 200 в didReceiveResponse? –

+0

Нет, я получаю 400. Есть ли разница с iOS 5 из-за https? Он отлично работает на iOS 6 ... Я отправляю точно такие же параметры для обоих. – Idan

+0

Кажется, проблема связана с «Chunked-Encoding» на iOS 5. Пожалуйста, проверьте мое обновление. – Idan

ответ

0

Вы не должны устанавливать Transfer-Encoding самостоятельно. NSURLConnection установит это для вас, когда это будет уместно.

В основном, для HTTP-сообщения требуется либо набор заголовков Content-Length, либо он использует закодированную кодировку передачи, где не должен быть установлен заголовок Content-Length.

При установке данных тела как потока через свойство запроса в HTTPBodyStream и не указать Content-Length явно NSURLConnection будет автоматически использовать Chunked кодирование передачи и основывая свое решение, когда данные тел закончено на состоянии ручья (обнаружение EOF).

В противном случае, если вы установите данные тела через свойство HTTPBody с NSData объекта, вы можете установить Content-Length в явном виде, или пусть NSURLConnection установить его для вас, на основе длины NSData объекта. В этом случае вы не получаете кодировку с чередованием.

В противном случае, если вы установили данные своего тела в виде потока (скажем, NSInputStream, который вы создали в качестве потока файлов) И установите заголовок Content-Length явно, NSURLConnection НЕ будет использовать закодированную передачу передачи.

Если возможно, установите длину содержимого даже для NSInputStream, то есть, когда вы в состоянии заранее знать, насколько велик объем тела. Могут быть серверы, которые имеют проблемы или просто не способны анализировать данные, передаваемые посредством кодированной передачи, например, Рельсы с «простым сервером», например, WEBrick при отправке данных JSON или XML. В противном случае веб-сервер все равно будет буферизовать все входные данные.

Смежные вопросы