2016-11-08 9 views
1

iOSアプリケーションでは、NSURLSessionConfiguration、NSURLSession、NSURLSessionDownloadTaskなどを使用して、サーバーがデータベースからその場で生成するxmlファイルをダウンロードします。 1つの特定のアカウントから大きなファイルをダウンロードしようとするまで、ダウンロードはすべてうまく動作します。私たちのサーバーは、このアカウントのxmlを配信する前に、多くの作業を行う必要があります。言い換えれば、サーバーが要求されたxmlを実際に吐き出す前に多少待たなければなりません。この最大のアカウントでは、サーバーがデータを正常に処理してクライアントに送信することを報告しても、iOSクライアントはデータを受信しません。NSURLSessionDownloadTaskのダウンロードがクライアントに届かないのはなぜですか?

テストしながら、私たちは、独特の何かに気づい:

  • 私たちはどんなSafariブラウザ(デスクトップまたはiOS)で同じXMLをダウンロードすることはできません

    1. を私たちは、私たちは、デスクトップ
    2. にChromeを使用してXMLをダウンロードすることができます私たちのiOSアプリでコマンドライン
    3. にカールを使用してXMLをダウンロードすることができ、それは、デバイスまたはシミュレータでXMLのダウンロードに失敗した

    私はtimeoutIntervalForRequestとtimeoutIntervalForResourceの両方を起動しました。それは「タイムアウト」ではありません。しかし、Appleのネットワーキングスタックでは、XMLがサーバーによって生成されるのを長い間待つことが許されていないようだ。そして、なぜChromeとカールが問題ないのですが、SafariとiOSコードは何をしていますか?だから、私はここで何が起こっているのかというと少し迷っている。

    これは従来のサーバーコードであり、今後はJSONやより高速なクラスに変更されるため、「サーバーコードを変更する」必要はありません。

    私のためのアイデアですか?前もって感謝します。

  • +0

    私はまた、AFNetworkingとカールを試みました、彼らはすべてプロジェクトで失敗します。しかし、私はターミナルで同じカールを実行することができ、それは動作します。 – Erick

    答えて

    2

    2つのタイムアウトがあります。特定の期間のデータがない場合、最初のものが表示されます。もう1つは、リクエストが特定の期間内に完了しない場合に発生します。両方とも十分に高い必要があります。私の推測では、サーバはその最初のタイムアウト時間内にステータスコードを返送していないため、NSURLスタックはサーバが死んだとみなします。

    問題を軽減するためにパラメータを調整することができたとしても、ネットワーク接続が(特にセルラー接続の)チャンスがゼロでないため、唯一の答えは「サーバーを変更する」ことです。ランダムにドロップします。

    これを解決する最も簡単な方法は、パラメータなしで、という小さなラッパースクリプトを書くことになります:

    • すぐにリソースの一意の識別子(UUID)を返します。
    • 名としてそのUUIDと、サーバからのリソースを要求し、ファイルに書き込むために
    • 格納My-UUID-Goes-Here.metaまたは類似でlibcurlのによって提供される予想されるファイルの長さを(サーバ上の)非同期カールジョブを生成します。
    • 何か問題が発生した場合は、ファイルを削除します。

    またはUUIDパラメータと:

    • は、UUIDは、特殊文字のない適切なUUIDであることを確認します。
    • 特定のディレクトリにそのUUIDを持つファイルがあるかどうかを確認し、ファイルが完全であることを確認します。
    • ファイルが不完全な場合は、受信したバイト数と予想されるバイト数の合計(または単に「準備ができていません」)が表示されます。
    • ファイルを戻してすぐに削除します。

    恐らく1日以上経過したファイルをクリーンアップするには、おそらく2行のcronスクリプトを使用します。

    それから、あなたのアプリはデータを要求してUUIDを返すことができます。それは、それがまだデータを持っているかどうかを定期的にサーバーに尋ねることができます。そして、「ここにデータがあります」または「いいえ、まだありません。

    +0

    興味深い応答、ありがとう! はい、両方のタイムアウト値を高く設定しています。 – Erick

    関連する問題