AFHTTPRequestOperation expira

Tengo algunas llamadas de web services en mi aplicación. Aquí hay un ejemplo de cómo los llamo

+(void) login:(NSDictionary *) loginParams { AppDelegate *appDelegate = (AppDelegate *)[[UIApplication shanetworkingApplication] delegate]; NSString * URLString = [MPTLogin getLoginWSAddress]; AFHTTPClient* client = [[AFHTTPClient alloc]initWithBaseURL:[NSURL URLWithString:URLString]]; NSMutableURLRequest *request = [client requestWithMethod:@"POST" path:URLString parameters:loginParams]; AFHTTPRequestOperation* operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { [[NSNotificationCenter defaultCenter] postNotificationName:@"didSuccessfullyAttemptLogin" object:nil userInfo:nil]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { if ([operation.response statusCode] == 401) [[NSNotificationCenter defaultCenter] postNotificationName:@"invalidUserNameOrPassword" object:self userInfo:nil]; else [[NSNotificationCenter defaultCenter] postNotificationName:@"didFailedAttemptLogin" object:self userInfo:nil]; }]; [operation start]; } 

El problema es que, si no se llama a ningún service web en 5-15 minutos, el siguiente service web llamará a time de espera. Luego, cualquier llamada después de eso toma solo una instancia de un segundo para completar, hasta que no se realicen llamadas durante algunos minutos. Luego vuelven a ocurrir las mismas cosas.

Esto solo sucede en el dispositivo. El simulador está bien. Además, este no es un problema de Wi-Fi. Estoy totalmente perdido en cuanto a cómo puedo depurar esto.

Actualización : Así que revisé los loggings del server y las llamadas no llegan a time. También intenté usar Charles Proxy . Lo más extraño sucedió. Cuando el proxy está activado, el time de espera no ocurre. De hecho, las llamadas casi suceden instantáneamente. Pero cuando me quito el proxy, sucede lo mismo.

Actualización: Este no es un problema de Wi-Fi porque lo hemos probado en diferentes dispositivos, diferentes conexiones Wi-Fi, en diferentes estados.

Actualización Entonces terminé configurando los times de espera a 150 segundos. Ahora, tengo less time de espera pero el problema es que cada vez que tengo un time de espera, la console dice que tomó 60 segundos. También el código de time de espera es -1001

Desde mi experiencia trabajando con web services y también con AFHTTPRequest, la request con time de espera está relacionada principalmente con el server / networking. Si se confirma que el server no tiene ningún problema, creo que lo mejor que puede hacer es dar la request a un TimeoutInterval (por ejemplo: 15 segundos). A continuación, si todavía recibe el error de time de espera de la request, puede probar la misma operación N veces .

Por ejemplo, puedes hacer algo como:

Llamar a la function con 3 rebashs:

 [ServerRequest yourMethodName:yourLoginDict with:3]; 

La function:-

 +(void)yourMethodName:(NSDictionary *) loginParams with:(NSUInteger)ntimes { if (ntimes <= 0) { NSLog(@"Request failed after trying for N times"); } else{ NSDictionary * postDictionary = loginParams; NSError * error = nil; NSData * jsonData = [NSJSONSerialization dataWithJSONObject:postDictionary options:NSJSONWritingPrettyPrinted error:&error]; NSString * urlString = [NSString stringWithFormat:@"%@",@"YOUR URL"]; //Give the Request 15 seconds to load NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:15.0]; [urlRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; [urlRequest setHTTPMethod:@"POST"]; [urlRequest setHTTPBody:jsonData]; AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:urlRequest]; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"Successful request"); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Request Failed at %d: %@",ntimes,error); //If the request failed, call again with ntimes-1 [self yourMethodName:loginParams with:ntimes-1]; } ]; [operation start]; } } 

Espero que esto ayude.

// Crear count de Twitter – (void) createTwitterAccountWithDictionary: dictionary (NSDictionary *) WithCompletionBlock: (void (^) (user * userObj, NSString * errorMessager)) completionBlock {

 AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager manager] initWithBaseURL:BASE_URL]; [SVProgressHUD showWithMaskType:SVProgressHUDMaskTypeGradient]; [manager POST:KCreateTwitterAccount parameters:dictionary success:^(AFHTTPRequestOperation *operation, id responseObject) { NSLog(@"Request url:%@",operation.request.URL); NSLog(@"Response: %@", responseObject); if ([responseObject[@"status"]isEqualToString:@"SUCCESS"]) { user *userObj = [[user alloc]initWithUserDictionary:responseObject[@"data"]]; completionBlock(userObj,nil); [SVProgressHUD showSuccessWithStatus:@"Success"]; } else{ [SVProgressHUD dismiss]; completionBlock(nil,responseObject[@"message"]); } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"Request url:%@",operation.request.URL); NSLog(@"Error: %@", error); [SVProgressHUD showErrorWithStatus:@"Failure"]; }]; 

}

y en AFURLResponseSerialization.m hicieron estos cambios

 - (instancetype)init { self = [super init]; if (!self) { return nil; } #pragma mark - did changes //add this @"text/html" self.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html", nil]; return self; }