web-dev-qa-db-ja.com

NSURLErrorDomain Code = -1004アプリ起動後数秒間

Alamofire API呼び出しで「NSURLErrorDomain Code = -1004」エラーが表示されますが、アプリの起動後数秒間のみ(またはアプリを開いて数分休憩してから呼び出します) )

数秒後に同じ呼び出しを行おうとすると、すべてが正常に機能します。スタックオーバーフローに関するすべての質問を検索し、以下の考えられるすべての原因を確認しました。

  1. インターネット接続に問題なし
  2. 「App Transport Security Settings」は正しく、サーバーはhttpsを使用しています(「NSAllowsArbitraryLoads = true」も試しましたが、解決しませんでした)
  3. 正常に動作するAPI

私の直感では、ネットワーク設定の取得には数秒かかり、それが完了する前にAPI呼び出しを行うと、すぐに失敗します。 OR ..関連する可能性のあるWebsocketをバックグラウンドで使用していますか?

失敗:エラードメイン= 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 =サーバーに接続できませんでした。}

助言がありますか?

[〜#〜] updated [〜#〜]

アプリが起動時に4つのリクエストを行い、そのうちの1つまたは2つがランダムに失敗することがわかりました。

22
Sebastian Kim

Nginx 1.10.0(および1.9.15)、iOS 9.3.1でHTTP/2とTLS 1.2を使用する場合も同じ問題が発生します。

この問題はHTTP/1.1で解消され、1.9.14までのNginxバージョンのHTTP/2でも機能します。

17
Adrian Schönig

Nginx 1.11.0 Mainlineは、このトピックで前述した修正を含むようになりました。

変更:HTTP/2クライアントは、すぐにリクエスト本文の送信を開始できます。 「http2_body_preread_size」ディレクティブは、nginxがクライアントリクエスト本文の読み取りを開始する前に使用されるバッファーのサイズを制御します。

私はそれをテストし、私にとってこのリリースは再び正しく動作するようになりました。

6
EricH206

これはnginx 1.10で確認されたバグのようです。それに関する問題は https://trac.nginx.org/nginx/ticket/979 のnginxのバグトラッカーで見つけることができます。実際の問題は https://trac.nginx.org/nginx/ticket/959 で見つけることができます

動作するリリースを含む1.9ブランチへの切り替えを検討することをお勧めします。願わくば、nginxがこのバグのないバージョン1.10.1をすぐにリリースすることを願っています。

この問題は、実際にはiOSでのみ発生します。 Android、Windows、およびOSX自体は、有効なhttp2接続のネゴシエーションに問題がないようです。

3
Rogier Slag

また、nginx 1.9.15が正しく機能しないことも確認できます。一部の呼び出しは常に「サーバーに接続できませんでした」と表示され、nginx 1.9.12に戻すとすべて正常に動作します。

2
Kimdv

これらは私が従おうとするステップです:

  • 1)シミュレーターとデバイスでアプリをテストする
  • 2)httpではなくhttpsが本当に必要かどうかを確認する
  • 3)alamofireマネージャーを構成し、タイムアウトを変更します(この手順では、いくつかのコードを記述します)。

    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コードが正しくない場合、設定してみてください。 Webサーバーのパラメーター。
1

問題が解決しました!!!

バージョン:

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

このような構成の場合:

listen 443 ssl; 

あなたと同じ問題を抱えています。

だが !!!

このような構成の場合:

listen 443 ssl http2;

問題が解決しました!!

0
goodspb