Error Dominio=NSURLErrorDomain Código=-1005 "Se perdió la conexión de red".
Tengo una aplicación que funciona bien en Xcode6-Beta1 y Xcode6-Beta2 tanto con iOS7 como con iOS8. Pero con Xcode6-Beta3, Beta4, Beta5 tengo problemas de red con iOS8 pero todo funciona bien en iOS7. Recibo el error "The network connection was lost."
. El error es el siguiente:
Error: Dominio de error = Código NSURLErrorDomain = -1005 "Se perdió la conexión de red". UserInfo=0x7ba8e5b0 {NSErrorFailingURLStringKey=, _kCFStreamErrorCodeKey=57, NSErrorFailingURLKey=, NSLocalizedDescription=Se perdió la conexión de red., _kCFStreamErrorDomainKey=1, NSUnderlyingError=0x7a6957e0 "Se perdió la conexión de red."}
Utilizo AFNetworking 2.x y el siguiente fragmento de código para realizar la llamada de red:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager setSecurityPolicy:policy];
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager POST:<example-url>
parameters:<parameteres>
success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@“Success: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
Lo intenté NSURLSession
pero sigo recibiendo el mismo error.
Reiniciar el simulador solucionó el problema.
Tuvimos exactamente este error y resultó ser un problema con la implementación HTTP subyacente de NSURLRequest
:
Por lo que sabemos, cuando iOS 8/9/10/11 recibe una respuesta HTTP con un Keep-Alive
encabezado, mantiene esta conexión para reutilizarla más tarde (como debería), pero la mantiene durante más tiempo que el timeout
parámetro del Encabezado Keep-Alive (parece mantener siempre activa la conexión durante 30 segundos). Luego, cuando la aplicación envía una segunda solicitud menos de 30 segundos después, intenta reutilizar una conexión que podría haber sido interrumpida por el servidor. (si Keep-Alive
ha transcurrido más del real ).
Estas son las soluciones que hemos encontrado hasta ahora:
- Aumente el parámetro de tiempo de espera del servidor por encima de 30 segundos. Parece que iOS siempre se comporta como si el servidor mantuviera la conexión abierta durante 30 segundos, independientemente del valor proporcionado en el encabezado Keep-Alive. (Esto se puede hacer para Apache configurando la
KeepAliveTimeout
opción. - Simplemente puede desactivar el mecanismo de mantenimiento de conexión para clientes iOS según el agente de usuario de su aplicación (por ejemplo, para Apache:
BrowserMatch "iOS 8\." nokeepalive
en el archivo modsetenvif.conf
). - Si no tiene acceso al servidor, puede intentar enviar sus solicitudes con un
Connection: close
encabezado: esto le indicará al servidor que corte la conexión inmediatamente y responda sin ningún encabezado de mantenimiento. PERO por el momento, NSURLSession parece anular elConnection
encabezado cuando se envían las solicitudes (no probamos esta solución exhaustivamente ya que podemos modificar la configuración de Apache)
Para el mío, Resetting content and settings
el simulador funciona. Para resetear el simulador sigue los pasos:
Simulador de iOS -> Restablecer contenido y configuración -> Presione Restablecer (en la advertencia que aparecerá)
El tiempo de ejecución del simulador de iOS 8.0 tiene un error por el cual si la configuración de su red cambia mientras se inicia el dispositivo simulado, las API de nivel superior (por ejemplo: CFNetwork) en el tiempo de ejecución simulado pensarán que ha perdido la conectividad de la red. Actualmente, la solución recomendada es simplemente reiniciar el dispositivo simulado cuando cambie la configuración de su red.
Si este problema lo afecta, presente radares duplicados adicionales en http://bugreport.apple.com para aumentar su prioridad.
Si ve este problema sin haber cambiado las configuraciones de red, entonces no es un error conocido y definitivamente debe presentar un radar, indicando que el problema no es el error conocido de cambio de configuración de red.