2013-10-30 9 views
18

新しいNSURLSessionでは、セッションの作成に使用されたNSURLSessionConfigurationオブジェクトにtimeoutIntervalForRequestが追加されました。NSURLSessionConfiguration timeoutIntervalForRequest対NSURLSession timeoutInterval

しかし、セッションにNSURLSessionTaskを作成するために使用できるNSURLRequestオブジェクトにはまだtimeoutIntervalがあります。

私の質問は、構成にtimeoutIntervalForRequestが30に設定されているが、タスクの作成にNSURLRequestを使用するとtimeoutIntervalが60になっています。タイムアウト間隔は実際に使用されますか?

答えて

17

NSURLSessionと一緒に使用した場合、iOS 7.0.3でのtimeoutIntervalNSURLRequestの調査では何の効果もありません。

NSURLSessionConfigurationtimeoutIntervalForRequestを設定するかどうかにかかわらず、timeoutIntervalは無視されます。

私の小さなサンプルアプリケーションNetworkTimeoutSampleを使用して、この動作を確認することができます。

NSURLRequesttimeoutIntervalに影響する「URLReq」フィールドに1を設定し、「NSRRLSession With URLRequest」ボタンをクリックすると、セッションにタイムアウトエラーが発生しません。

また、あなたがNSURLRequesttimeoutIntervalに同じタイムアウト効果を取得したい場合は、NSURLSessionのために代わりtimeoutIntervalForRequestの、timeoutIntervalForResourceを設定する必要が認識することができます。

NSURLSessionConfigurationの値をtimeoutIntervalForRequesttimeoutIntervalForResourceに設定すると、小さい値が影響を受けます(この動作は現在のAPIドキュメントとは異なると思います)。

これらの仕様に関するドキュメントは存在しないため、将来のiOSバージョンで変更される可能性があります。

+0

こんにちは、あなたの答えは正しい方向に私を送ります。それは、timeoutIntervalForRequestとtimeoutIntervalForResourceが使用されるべきであることを認識させました。しかし、NSURLSessionDownloadTaskをバックグラウンドで使用すると、タイムアウトの遅延後にコールバックが呼び出されることはありません。どのコールバックが呼び出されてタイムアウトになるのですか?それはまだURLSessionですか?task:didCompleteWithError:? –

+0

OK、バックグラウンドセッションを使用していないときに動作するようです...しかし、バックグラウンドセッションを使用しているときには動作しません... –

+0

私のWebサービスのタイムアウト間隔を180秒(3分)にします。 NSURLSESSIONとそのtimeoutIntervalForRequestとtimeoutIntervalForResourceについて、私はNSMutableURLRequest.ieのtimeOutIntervalと同じ結果を返すこれらを使って試しました。私はsessionConfig.timeoutIntervalForRequest = 180.0のような180秒のタイムアウト間隔を設定しています。 sessionConfig.timeoutIntervalForResource = 180.0;しかし、私は75秒以内に、または何らかのランダムな時間間隔で、 '要求がタイムアウトしました'と言って失敗のコールバックを受け取っています。これについて何か考えていますか? – XiOS

4

iOS8以降、バックグラウンドモードのNSUrlSessionは、サーバーが応答しない場合、このデリゲートメソッドを呼び出しません。 -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error ダウンロード/アップロードは無期限にアイドル状態のままです。このデリゲートは、サーバーが応答しないときにエラーが発生したiOS7で呼び出されます。

一般に、NSURLSessionバックグラウンドセッションは、何か問題がワイヤ上で発生した場合にタスクを失敗させません。むしろ、それは要求を実行するための良い時間を探し続け、その時点で再試行します。これは、リソースのタイムアウト(セッションの作成に使用するNSURLSessionConfigurationオブジェクトのtimeoutIntervalForResourceプロパティの値)が満了するまで続きます。その値の現在のデフォルトは1週間です!言い換えれば、iOS7でタイムアウトに失敗したという動作は正しくありませんでした。バックグラウンドセッションのコンテキストでは、ネットワークの問題のためにすぐに失敗しない方が面白いです。だからiOS8以来、NSURLSessionタスクはタイムアウトやネットワークの喪失があっても継続します。ただし、timeoutIntervalForResourceに達するまで続行されます。

したがって、基本的にtimeoutIntervalForRequestはバックグラウンドセッションでは機能しませんが、timeoutIntervalForResourceは動作します。

Appleのスタッフの一人、developer forumからこの回答がありました。また、私はこれを実装して検証しました。

+1

NSURLSessionを使用して、指定されたURLがまだアクティブか破損しているかどうかをチェックしています。何時に 'timeoutIntervalForResource'を設定するべきですか?私の目標は、URLがアクティブかどうかを判断するのに必要な絶対最小時間を設定することです。 – GarySabo

+1

私の実験では、 'timeoutInterval'を' NSURLRequest'のために15秒に設定し、 'NSURLSession'をバックグラウンドセッションとすると、iOSは約試し続けます。 'timeoutIntervalForResource'に達するまで15秒ごとに起動します。 iOSがあなたのネットワークが良いと思っているなら、もちろん起こります。コールバックは呼び出されません - それは本当です。 iOS 9.2/ –

+0

でテスト済み@GarySabo:あなたは到達可能性モジュールを使うべきだと思います。 –

2

n-miyoがテストしてから変更されたように見えます。

apple documentationは、NSURLRequest値がセッション構成をオーバーライドすると述べています。

In some cases, the policies defined in this configuration may be overridden by policies specified by an NSURLRequest object provided for a task. Any policy specified on the request object is respected unless the session’s policy is more restrictive. For example, if the session configuration specifies that cellular networking should not be allowed, the NSURLRequest object cannot request cellular networking.

関連する問題