2016-04-28 95 views
21

我得到「NSURLErrorDomain代碼= -1004」與Alamofire API調用, 但只有幾秒鐘錯誤後應用程序啓動(或拍了休息幾分鐘,而應用程序的打開,然後撥打電話)NSURLErrorDomain代碼= -1004幾秒鐘後,應用程序啓動

如果我嘗試幾秒鐘後進行相同的調用,一切工作正常。 我找遍了所有的堆棧溢出的問題,並檢查以下所有可能的原因:

  1. 與Internet連接沒有問題
  2. 「應用交通運輸安全設置」是正確的,服務器的使用HTTPS(我也試過「NSAllowsArbitraryLoads =真「但這並沒有幫助)
  3. API的工作正常

我的直覺是,讓網絡設置需要幾秒鐘,當我提出一個API調用的完成之前,它只是立即失敗。或..我在背景中使用WebSocket可能是相關的?

FAILURE:錯誤域= NSURLErrorDomain代碼= -1004「無法連接到服務器。」 UserInfo = {NSUnderlyingError = 0x137d39380 {Error Domain = kCFErrorDomainCFNetwork Code = -1004「(null)」UserInfo = {NSErrorPeerAddressKey = {length = 16,capacity = 16,bytes = 0x100201bb341a9f540000000000000000},_kCFStreamErrorCodeKey = -2200,_kCFStreamErrorDomainKey = 4} NSErrorFailingURLStringKey = [FILTERED],NSErrorFailingURLKey = [FILTERED],_kCFStreamErrorDomainKey = 4,_kCFStreamErrorCodeKey = -2200,NSLocalizedDescription =無法連接到服務器。}

任何建議?

修訂

研究發現,應用程序,使得在啓動4個請求,以及1或2其中隨機失敗,我檢查Nginx的訪問和錯誤日​​志,有沒有日誌失敗的電話都沒有。

+0

我有這個確切的問題,因爲我將我的網絡庫從AFNetworking 2.x升級到3.x.如果您想出解決方案,請告訴我。到目前爲止,我還確認了SSL協商正在發生,這表明「無法連接到服務器」並不是真正的原因。我也嘗試關閉ATS和證書鎖定。所有事情在一分鐘或兩分鐘後開始工作,但前幾個請求失敗。 –

+0

有沒有人最終發現了什麼錯誤?我有同樣的問題... :( –

+1

@BartoszHernas,你運行的是什麼版本的nginx?我們在這裏與nginx 1.10,iOS 9.3.1使用HTTP/2和TLS 1.2相同的問題。 /1.1。我們可以在Wireshark看到應用只連接一次,這是成功的,但第一個請求失敗。 –

回答

15

在這裏,我們有同樣的問題與Nginx的1.10.0(和15年9月1日),的iOS 9.3.1使用HTTP/2 TLS 1.2。

問題消失與HTTP/1.1和它也與HTTP/2工作在Nginx的版本長達14年1月9日。

+1

我在生產中使用nginx/1.9.12,在分段上使用nginx/1.9.15。 我可以證實你在說什麼,你有什麼想法爲什麼會發生? 你是否爲nginx開了個問題? –

+0

是的,它被標記爲這個問題的重複:https://trac.nginx.org/nginx/ticket/959 –

+2

哦,太棒了感謝這個信息!我花了2天時間找到解決方案。我已經嘗試了很多App Transport Security設置,http libs和其他。 –

1

這些是我想嘗試遵循的步驟:

  • 1)測試我的應用程序在模擬器和設備
  • 2)看,如果HTTPS是真正需要的,而不是http
  • 3 )配置alamofire經理和變化超時(此步驟i 寫一些代碼):

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

(所以白衣這最後一步,接下來的alamofire呼叫可以是例如:alamofireManager.request(etc....

  • 4)測試與像http://www.google.com硬鏈接,如果同樣的事情 不要發生在你的SWIFT代碼沒有什麼是不正確的,嘗試到 設置網絡服務器參數..
+0

1.測試兩個模擬器和幾臺設備,並且結果是真正需要同 –

+0

2. HTTPS,3試過了,沒有解決 –

+1

4.嘗試使用硬鏈接「https://google.com」,但沒有發生。也許Nginx或網絡服務器存在一些問題。我會看看。感謝您的回答 –

3

這似乎是nginx 1.10中的一個確認錯誤。關於它的一個問題可以在nginx的bug跟蹤器https://trac.nginx.org/nginx/ticket/979上找到。實際的問題,可以在https://trac.nginx.org/nginx/ticket/959

找到你可能要考慮切換到1.9分支具有釋放該做的工作。希望nginx能很快發佈1.10.1版本,它沒有這個bug。

這個問題實際上只發生在iOS上; Android,Windows和OSX本身在協商有效的http2連接時似乎沒有問題。

+0

有沒有解決這個問題的方法?或者我應該恢復到nginx 1.9.14? –

+0

恢復回來會有所幫助。然而,這不是穩定的分支。恢復到1.8.1會讓你再次訪問spdy。蘋果確實標記了現在已確認的錯誤 –

2

我也可以確認nginx 1.9.15不能正常工作。一些調用總是得到「無法連接到服務器」,並在恢復到nginx 1.9.12後,一切正常。

+0

我也在1.9.15中也有同樣的問題 –

6

Nginx的1.11.0主線與修復中包括本主題前面提到現在可用;

更改:HTTP/2客戶端現在可以立即開始發送請求主體 ; 「http2_body_preread_size」指令控制 的大小,在nginx開始讀取客戶端請求主體之前使用的緩衝區。

我測試了它和我這個版本現在又正確地工作。

0

問題解決了!

版本:

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

當這樣的配置:

listen 443 ssl; 

有像你一樣的問題。

但是!!!

當這樣的配置:

listen 443 ssl http2; 

問題解決了!

相關問題