2016-04-28 62 views
21

sto ottenendo "Codice NSURLErrorDomain = -1004" Errore con chiamate API Alamofire, ma solo per alcuni secondi dopo l'applicazione ha iniziato (o ha preso un periodo di riposo per alcuni minuti mentre l'app è aperta ed effettua una chiamata successivamente)NSURLErrorDomain Codice = -1004 per alcuni secondi dopo l'applicazione di avvio

Se provo a effettuare la stessa chiamata dopo pochi secondi, tutto funziona correttamente. Ho cercato tutte le domande Stack Overflow e controllato tutte le possibili cause di seguito:

  1. Nessun problema con la connessione a Internet
  2. "App Impostazioni sicurezza dei trasporti" sono corretti e il server di utilizzare HTTPS (ho anche provato "NSAllowsArbitraryLoads = true "ma questo non ha aiutato)
  3. API lavorando bene

la mia sensazione è che ottenere le impostazioni di rete richiede pochi secondi e quando faccio una chiamata API prima di questo è fatto, semplicemente non riesce immediatamente. O .. Sto usando un Websocket in background che potrebbe essere correlato?

FAILURE: errore Dominio = NSURLErrorDomain Code = -1004 "Impossibile connettersi al server." UserInfo = {NSUnderlyingError = 0x137d39380 {Dominio errore = kCFErrorDomainCFNetwork Code = -1004 "(null)" UserInfo = {NSErrorPeerAddressKey = {lunghezza = 16, capacità = 16, byte = 0x100201bb341a9f540000000000000000}, _kCFStreamErrorCodeKey = -2200, _kCFStreamErrorDomainKey = 4}}, NSErrorFailingURLStringKey = [filtrato], NSErrorFailingURLKey = [filtrato], _kCFStreamErrorDomainKey = 4, _kCFStreamErrorCodeKey = -2200, NSLocalizedDescription = Impossibile connettersi al server.}

Qualche suggerimento?

AGGIORNATO

scoperto che applicazione rende 4 richieste di lancio, e 1 o 2 di loro non riesce a caso, e ho controllato Nginx l'accesso e l'errore di registro e non c'è alcun registro per le chiamate non riuscite a tutti.

+0

Sto avendo questo problema esatto mentre sto aggiornando le mie librerie di rete da AFNetworking 2.x a 3.x. Per favore fatemi sapere se vi viene in mente una soluzione al problema. Finora ho anche confermato che si sta svolgendo la negoziazione ssl che indica che "non è possibile connettersi al server" non è la vera causa. Ho anche provato a disattivare ATS e il blocco dei certificati. Tutto inizia a funzionare dopo un minuto o 2, ma le prime diverse richieste falliscono. –

+0

Qualcuno ha capito che cosa è sbagliato alla fine? Ho lo stesso problema ... :( –

+1

@BartoszHernas, quale versione di nginx stai usando? Abbiamo lo stesso problema qui con nginx 1.10, iOS 9.3.1 usando HTTP/2 con TLS 1.2. /1.1 Possiamo vedere in Wireshark che l'app si connette solo una volta, che ha successo, ma la prima richiesta fallisce –

risposta

15

Abbiamo lo stesso problema qui con Nginx 1.10.0 (e 1.9.15), iOS 9.3.1 utilizzando HTTP/2 con TLS 1.2.

Il problema scompare con HTTP/1.1 e funziona anche con HTTP/2 in versione Nginx fino a 1.9.14.

+1

Sto usando nginx/1.9.12 su produzione e nginx/1.9.15 su staging. Posso confermare quello che stai dicendo, hai qualche idea del perché sta succedendo? Hai aperto un problema per nginx? –

+0

Sì, è contrassegnato come un duplicato di questo problema: https://trac.nginx.org/nginx/ticket/959 –

+2

Oh, grazie mille per queste informazioni! Ho impiegato 2 giorni per trovare la soluzione. Ho provato molte impostazioni di sicurezza del trasporto app, librerie http e altre. –

1

Questi sono i passi che avrei cercato di seguire:

  • 1) testare la mia applicazione nel simulatore e dispositivo
  • 2) cercare se HTTPS è realmente necessario, invece di http
  • 3) configurare un gestore alamofire e il cambiamento timeout (per questo passo i scrivere del codice):

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

(così briciolo quest'ultima fase le chiamate alamofire prossimi possono essere per esempio: alamofireManager.request(etc....)

  • 4) test con hard link come http://www.google.com, se la stessa cosa Non è successo niente intorno il codice swift non sono corrette, provare per impostare i parametri del server web ..
+0

1. Testato sia in simulatore che in pochi dispositivi, e i risultati sono uguali –

+0

2. https è davvero necessario, 3. Provato quello, non ha risolto –

+1

4. Provato con un hard link "https://google.com" e non è successo. Forse ci sono alcuni problemi con Nginx o il server web. Darò un occhiata. Grazie per la risposta –

3

Questo sembra un bug confermato in nginx 1.10. Un problema a riguardo può essere trovato sul bug tracker di nginx allo https://trac.nginx.org/nginx/ticket/979. Il problema reale può essere trovato a https://trac.nginx.org/nginx/ticket/959

Si potrebbe voler prendere in considerazione il passaggio al ramo 1.9 che ha versioni che funzionano. Speriamo che nginx rilascerà presto una versione 1.10.1 che non ha questo bug.

Il problema si verifica in realtà solo su iOS; Sembra che Android, Windows e OSX non abbiano problemi a negoziare una connessione http2 valida.

+0

C'è qualche soluzione per questo problema? O dovrei tornare a nginx 1.9.14? –

+0

Tornando indietro sarebbe di aiuto. Tuttavia questo non è il ramo stabile. Tornando alla versione 1.8.1 si otterrebbe di nuovo l'accesso spdy. Apple ha contrassegnato il bug come confermato ora anche se –

2

Posso anche confermare che il nginx 1.9.15 non funziona correttamente. Alcune chiamate hanno sempre "Impossibile connettersi al server" e, dopo il ripristino di nginx 1.9.12, tutto funziona correttamente.

+0

ho lo stesso problema anche in 1.9.15 –

6

Nginx 1.11.0 Mainline è ora disponibile con la correzione inclusa in precedenza in questo argomento;

Modifica: i client HTTP/2 possono ora iniziare a inviare immediatamente il corpo della richiesta ; la direttiva "http2_body_preread_size" controlla la dimensione di il buffer utilizzato prima che nginx inizi a leggere il corpo della richiesta del client.

L'ho provato e per me questa versione ora funziona di nuovo correttamente.

0

Problema risolto !!!

versioni:

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

Quando la configurazione in questo modo:

listen 443 ssl; 

hanno lo stesso problema come te.

Ma !!!

Quando la configurazione in questo modo:

listen 443 ssl http2; 

Problema risolto !!