NSURLErrorDomain Code = -1004 durante unos segundos después de la puesta en marcha de la aplicación

Recibo el error "NSURLErrorDomain Code = -1004" con las llamadas a la API Alamofire, pero solo durante unos segundos después de que comenzó la aplicación (o tomé un descanso durante unos minutos mientras la aplicación se abrió y hago una llamada después de eso)

Si trato de hacer la misma llamada después de unos segundos, todo funciona bien. Busqué en todas las preguntas de Stack Overflow y revisé todas las causas posibles a continuación:

  1. No hay problema con la connection a Internet.
  2. "Ajustes de security de transporte de aplicaciones" son correctos y el server utiliza https (también probé "NSAllowsArbitraryLoads = true", pero eso no ayudó)
  3. API funcionando bien

Mi intuición es que get la configuration de la networking toma unos segundos y cuando hago una llamada a la API antes de que se complete, simplemente falla de inmediato. O … ¿Estoy usando un Websocket en segundo plano que podría estar relacionado?

FALLO: Error Domain = NSURLErrorDomain Code = -1004 "No se pudo conectar al server". UserInfo = {NSUnderlyingError = 0x137d39380 {Error Domain = kCFErrorDomainCFNetwork Code = -1004 "(null)" UserInfo = {NSErrorPeerAddressKey = {longitud = 16, capacidad = 16, bytes = 0x100201bb341a9f540000000000000000}, _kCFStreamErrorCodeKey = -2200, _kCFStreamErrorDomainKey = 4}}, NSErrorFailingURLStringKey = [FILTERED], NSErrorFailingURLKey = [FILTERED], _kCFStreamErrorDomainKey = 4, _kCFStreamErrorCodeKey = -2200, NSLocalizedDescription = No se pudo conectar al server.}

¿Alguna sugerencia?

ACTUALIZADO

Se encontró que la aplicación hace 4 requestes al iniciar, y 1 o 2 de ellas fallan random, y comprobé el acceso y el logging de errores de Nginx y no hay logging para las llamadas fallidas.

Tenemos el mismo problema aquí con Nginx 1.10.0 (y 1.9.15), iOS 9.3.1 con HTTP / 2 con TLS 1.2.

El problema desaparece con HTTP / 1.1 y también está funcionando con HTTP / 2 en la versión de Nginx hasta 1.9.14.

Nginx 1.11.0 Mainline ahora está disponible con la solución incluida anteriormente mencionada en este tema;

Cambio: los clientes HTTP / 2 ahora pueden comenzar a enviar el cuerpo de la request de inmediato; la directiva "http2_body_preread_size" controla el tamaño del búfer usado antes de que nginx comience a leer el cuerpo de la request del cliente.

Lo probé y para mí esta versión ahora funciona correctamente otra vez.

Esto parece ser un error confirmado en nginx 1.10. Se puede encontrar un problema al respecto en el rastreador de errores de nginx en https://trac.nginx.org/nginx/ticket/979 . El problema real se puede encontrar en https://trac.nginx.org/nginx/ticket/959

Es posible que desee considerar cambiar a la twig 1.9 que tiene versiones que funcionan. Con suerte, nginx lanzará pronto una versión 1.10.1 que no tiene este error.

El problema en realidad solo ocurre en iOS; Android, Windows y OSX en sí no parecen tener problemas para negociar una connection http2 válida.

También puedo confirmar que el nginx 1.9.15 no funciona correctamente. Algunas llamadas siempre obtuvieron "No se pudo conectar al server", y después de volver a nginx 1.9.12, todo funciona bien.

Estos son los pasos que intentaré seguir:

  • 1) testing mi aplicación en el simulador y el dispositivo
  • 2) mira si realmente se necesita https en lugar de http
  • 3) configure un administrador de alamofire y cambie el time de espera (para este paso escribo algún código):

    var alamofireManager = Alamofire.Manager.shanetworkingInstance let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() configuration.HTTPMaximumConnectionsPerHost = 10 configuration.timeoutIntervalForRequest = 30 configuration.timeoutIntervalForResource = 30 alamofireManager.delegate.taskWillPerformHTTPRedirection = nil 

(por lo que con este último paso las siguientes llamadas alamofire pueden ser, por ejemplo: alamofireManager.request(etc.... )

  • 4) testing con un enlace difícil como http://www.google.com , si lo mismo no sucedió nada en tu código Swift es incorrecto, intenta configurar los parameters de tu server web.

¡¡¡Problema resuelto!!!

versiones:

 1. Nginx version: 1.10.2 2. IOS version: 9.3.2 

Cuando la configuration es como esta:

 listen 443 ssl; 

Tiene el mismo problema como tú.

Pero !!!

Cuando la configuration es como esta:

 listen 443 ssl http2; 

¡¡Problema resuelto!!