El intervalo de tiempo de espera NSMutableURLRequest no se tiene en cuenta para las solicitudes POST

Tengo el siguiente problema. En una NSMutableURLRequest utilizando el método HTTP POST se ignora el intervalo de tiempo de espera establecido para la conexión. Si la conexión a Internet tiene un problema (proxy incorrecto, DNS incorrectos), la solicitud de URL falla después de aproximadamente 2-4 minutos, pero no con NSLocalizedDescription = "timed out";

 NSUnderlyingError = Error Domain=kCFErrorDomainCFNetwork Code=-1001 UserInfo=0x139580 "The request timed out. 

Si el método http utilizado es GET , funciona bien. La conexión es async sobre https .

  NSURL *url = [NSURL URLWithString:urlString]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setTimeoutInterval:10]; //Set the request method to post [request setHTTPMethod:@"POST"]; if (body != nil) { [request setHTTPBody:body]; } // Add general parameters to the request if (authorization){ [request addValue: authorization forHTTPHeaderField:@"Authorization"]; } [request addValue: WS_HOST forHTTPHeaderField:@"Host"]; [request addValue:@"text/xml" forHTTPHeaderField:@"Content-Type"]; [[NSURLCache sharedURLCache] setDiskCapacity:0]; [self addToQueueRequest:request withDelegate:delegate]; ' 

De acuerdo con una publicación en el foro de desarrolladores de Apple, el intervalo mínimo de tiempo de espera para el POST es de 240 segundos. Cualquier intervalo de tiempo de espera más corto que eso se ignora.

Si necesita un intervalo de tiempo de espera más corto, use una solicitud asíncrona junto con un temporizador y cancelación de llamadas en la NSURLConnection según sea necesario.

enlace al hilo: aquí

iOS 6 ha solucionado este problema.

 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:20]; [request setHTTPMethod:method]; [request setHTTPBody:requestBody]; NSLog(@"%f", [request timeoutInterval]); //20.0 in iOS 6 //240.0 in iOS 4.3, 5.0, 5.1 

Reparado con la sugerencia de Clay Chambers: con un temporizador personalizado Se agregó un temporizador en una subclase de NSURLConnection

 if (needsSeparateTimeout){ SEL sel = @selector(customCancel); NSMethodSignature* sig = [self methodSignatureForSelector:sel]; NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:sig]; [invocation setTarget:self]; [invocation setSelector:sel]; NSTimer *timer = [NSTimer timerWithTimeInterval:WS_REQUEST_TIMEOUT_INTERVAL invocation:invocation repeats:NO]; [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; } 

En el método de cancelación personalizado, la conexión se cancela

 [super cancel]; 

Parece que el problema descrito aquí todavía se enfrenta a iOS 7.1 (o reapareció). Afortunadamente, parece que la configuración de la propiedad timeoutIntervalForResource en la configuración de NSURLSession puede solucionarlo.

EDITAR

Según las observaciones de @XiOS, esto funciona para tiempos de espera más cortos que (alrededor de) 2 minutos.

Si te refieres a cómo manejar el error de tiempo de espera, creo que nadie responde esta pregunta todavía

Déjame escribir un pice de mi código para Explicar ese punto

 // replace "arg" with your argument you want send to your site NSString * param = [NSString stringWithFormat:@"arg"]; NSData *Postdata = [param dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; NSString *postLength = [NSString stringWithFormat:@"%lu",(unsigned long)[Postdata length]]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init]; // replace "yoursite" with url of site you want post to [request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"http//yoursite"]]]; // set what ever time you want in seconds 120 mean 2 min , 240 mean 4 min [request setTimeoutInterval:120]; [request setHTTPMethod:@"POST"]; [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Current-Type"]; [request setHTTPBody:Postdata]; NSURLConnection * connection = [[NSURLConnection alloc]initWithRequest:request delegate:self]; // if request time out without response from server error will occurred -(void) connection:(NSURLConnection * ) connection didFailWithError:(NSError *)error { if (error.code == NSURLErrorTimedOut) // handle error as you want NSLog(@"Request time out , Please try again later"); } 

Espero que esta ayuda con cualquiera pregunte cómo manejar el error de tiempo de espera