1

이것은 웹 서비스 호출입니다. 웹 서비스를 지속적으로 호출하는 경우 시간 초과 오류가 발생하기 시작하지만 인터넷을 사용할 수 있습니다. 안드로이드iOS : 인터넷 연결을 사용할 수 있지만 웹 서비스 호출에서 시간 초과 오류가 발생합니다. 동일한 웹 서비스가 안드로이드에서 작동 중입니다.

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; 
request.timeoutInterval = 30; 
request.URL = [NSURL URLWithString:finalURL]; 
request.HTTPMethod = @"POST"; 
[request setValue:@"123456" forHTTPHeaderField:@"header"]; 

if (parameters != nil) { 
    NSMutableData * body = [[NSMutableData alloc] init]; 
    NSString *boundary = @"---------------------------V2ymHFg03ehbqgZCaKO6jy"; 
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; 
    [request addValue:contentType forHTTPHeaderField:@"Content-Type"]; 

    for (id key in parameters) { 
     [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData:[[NSString stringWithFormat:@"%@", [parameters objectForKey:key]] dataUsingEncoding:NSUTF8StringEncoding]]; 
    } 
    [request addValue:[NSString stringWithFormat:@"%lu", (unsigned long)[body length]] forHTTPHeaderField:@"Content-Length"]; 
    [request setHTTPBody:body]; 

} 

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error){ 


    // This will get the NSURLResponse into NSHTTPURLResponse format 
    NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response; 
    if (httpResponse.statusCode == 200) { 

     NSMutableDictionary *JSON = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      NSLog(@"Response = %@",JSON); 

     }); 

    } else { 
     NSLog(@"Error = %@",error); 

    } 


}]; 
+0

올바른 URL을 치고 있는지 확인할 수 있습니까? 또한, 우체부 또는 기타 유사한 http 클라이언트에서 URL과 본문을 치고 해당 클라이언트가 작동하는지 확인하십시오. – 7vikram7

+0

timeoutInterval 값을 변경하십시오. 나는 디폴트 값이 60이라고 생각한다. –

+0

우편 배달부와 안드로이드 폰에서 잘 작동하고있다. –

답변

0

에서 제대로 작동

같은 웹 서비스는이 시도 :

NSString *strServicePath = @"YourURLString"; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:strServicePath]]; 
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; 
[request setHTTPShouldHandleCookies:NO]; 
[request setTimeoutInterval:60]; 
[request setHTTPMethod:@"POST"]; 

NSString *boundary = [NSString stringWithFormat:@"Boundary-%@", [[NSUUID UUID] UUIDString]]; 

// set Content-Type in HTTP header 
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]; 
[request setValue:contentType forHTTPHeaderField: @"Content-Type"]; 

NSDictionary *_params = [NSDictionary dictionaryWithObjectsAndKeys:yourValue,@"yourKey",nil]; 

// post body 
NSMutableData *body = [NSMutableData data]; 
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 

for (NSString *param in _params) { 
    NSMutableString *strPart = [NSMutableString stringWithFormat:@"%@",[self createPartWithKey:param value:[_params objectForKey:param] boundary:boundary encoding:@"8bit" contentType:@"text/plain" contentFilename:@""]]; 
    [body appendData:[strPart dataUsingEncoding:NSUTF8StringEncoding]]; 
} 

//You can give your own strProfileImageName     
NSString *strProfileImageName = [NSString stringWithFormat:@"%@_%@_.jpg",@"some_pic",_userID]; 

if (imageData) { 
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=%@; filename=%@\r\n", @"some_pic",strProfileImageName] dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; 
    [body appendData:imageData]; 
    [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
} 
[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
// setting the body of the post to the reqeust 
[request setHTTPBody:body]; 

// set the content-length 
NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[body length]]; 
[request setValue:postLength forHTTPHeaderField:@"Content-Length"]; 

[NSURLConnection sendAsynchronousRequest:request queue:  [NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
    //Your Code Here 

}]; 

봅니다이에 구현. 희망이 도움이됩니다.

+0

감사합니다. 하지만 iphone 5에서 응답하기 위해 많은 시간이 필요합니다. 4에서 잘 작동합니다. –

+0

가끔은 그렇지 않습니다. 사용해보십시오 dispatch_async (dispatch_get_main_queue(),^{ // 여기에 요청 전화 }); –

+0

사용되었지만 안드로이드에 비해 응답 시간이 오래 걸립니다. 백그라운드 프로세스에 문제가 있습니까? –

1

잘못된 배열에 액세스하는 것처럼 보입니다.

for (id key in parameters) { 
     [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData:[[NSString stringWithFormat:@"%@", [parameters objectForKey:key]] dataUsingEncoding:NSUTF8StringEncoding]]; 
    }

위의 코드에서 매개 변수는 사전 대신 문자열 배열 인 것으로 보입니다.

대신 아래 코드를 사용할 수 있습니다.

[parameters enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj,BOOL *_Nonnull stop) { 
     [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", key] dataUsingEncoding:NSUTF8StringEncoding]]; 
     [body appendData:[[NSString stringWithFormat:@"%@", obj] dataUsingEncoding:NSUTF8StringEncoding]]; 
    }];