1

업데이트 : 분명히 iOS 5에서 문제는 "Chunked-Encoding"입니다. 서버에서 iOS 5에서 어떤 이유로 든 전송이 끝나지 않는 것 같습니다 (iOS 6에서는 모든 것이 작동 함). 누구든지 그 주위에 방법이 있습니까? 아이폰 OS 6과 동일한 버전의 시뮬레이터에서 완벽하게 작동하지만 이전 장치에 그것을 테스트 할 때 난 단지iOS 5에서 NSURLConnection을 사용하면 제대로 작동하지 않습니다.

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 

와 결코와 응답을 내가있는 NSURLConnection을 사용하고


- (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

didReceiveResponse에 200 점이 있습니까? –

+0

아니요, 400이됩니다. https 때문에 iOS 5와 어떤 차이가 있습니까? 그것은 iOS 6에서 완벽하게 작동합니다 ... 두 가지 모두 정확히 동일한 매개 변수를 보내고 있습니다. – Idan

+0

iOS 5에서 "Chunked-Encoding"문제가있는 것 같습니다. 내 업데이트를 체크 아웃하십시오. – Idan

답변

0

전송 인코딩을 청크로 설정해서는 안됩니다. NSURLConnection이 적합 할 때 이것을 설정합니다.

기본적으로 HTTP 메시지에는 Content-Length 헤더 세트가 필요하거나 Content-Length 헤더를 설정하지 않아도되는 청크 분할 전송 인코딩이 사용됩니다.

당신이 요청의 재산 HTTPBodyStream를 통해 스트림로 본문 데이터를 설정하고 명시 적으로 콘텐츠 길이를 지정하지 않으면 신체 데이터 스트림의 상태에 완료되면, NSURLConnection가 자동으로 청크 분할 전송 인코딩 및 결정을 내놓고을 사용합니다 (EOF 검출). 당신이 NSData 개체와 특성 HTTPBody을 통해 몸의 데이터를 설정 한 경우

그렇지 않으면, 당신은 명시 적으로 콘텐츠 길이를 설정하거나 NSData 객체의 길이에 따라 당신을 위해 NSURLConnection 세트를, 할 수 있습니다. 이 경우 청크 분할 전송 인코딩을 사용할 수 없습니다.

그렇지 않으면 몸체 데이터를 스트림으로 설정하고 (예 : 파일 스트림으로 만든 NSInputStream) 콘텐츠 길이 헤더를 명시 적으로 설정하면 NSURLConnection은 청크 분할 전송 인코딩을 사용하지 않습니다.

가능하면 몸 길이가 얼마나 큰지 미리 알 수있는 경우 콘텐츠 길이가 NSInputStream 인 경우에도 설정하십시오. 문제가 있거나 단순히 청크 분할 전송 인코딩을 통해 전송 된 데이터를 구문 분석 할 수없는 서버가있을 수 있습니다. JSON 또는 XML 데이터를 보낼 때 WEBrick과 같은 "단순한 서버"가있는 레일스. 그렇지 않으면 웹 서버는 모든 입력 데이터를 버퍼링합니다.