Alamofire API呼び出しで「NSURLErrorDomain Code = -1004」エラーが表示されますが、アプリの起動後数秒間のみ(またはアプリを開いて数分休憩してから呼び出します) )
数秒後に同じ呼び出しを行おうとすると、すべてが正常に機能します。スタックオーバーフローに関するすべての質問を検索し、以下の考えられるすべての原因を確認しました。
私の直感では、ネットワーク設定の取得には数秒かかり、それが完了する前に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つがランダムに失敗することがわかりました。
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でも機能します。
Nginx 1.11.0 Mainlineは、このトピックで前述した修正を含むようになりました。
変更:HTTP/2クライアントは、すぐにリクエスト本文の送信を開始できます。 「http2_body_preread_size」ディレクティブは、nginxがクライアントリクエスト本文の読み取りを開始する前に使用されるバッファーのサイズを制御します。
私はそれをテストし、私にとってこのリリースは再び正しく動作するようになりました。
これは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接続のネゴシエーションに問題がないようです。
また、nginx 1.9.15が正しく機能しないことも確認できます。一部の呼び出しは常に「サーバーに接続できませんでした」と表示され、nginx 1.9.12に戻すとすべて正常に動作します。
これらは私が従おうとするステップです:
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....
)
問題が解決しました!!!
バージョン:
1. Nginx version: 1.10.2
2. IOS version: 9.3.2
このような構成の場合:
listen 443 ssl;
あなたと同じ問題を抱えています。
だが !!!
このような構成の場合:
listen 443 ssl http2;
問題が解決しました!!