2017-02-20 2 views
0

WiFi接続をオフにして、iPhone 6s 10.2シミュレータで次のコードを実行すると、コールバックは実行されません。私はコールバックが「インターネット接続なし」のようなエラーでかなり早く発砲することを期待していました。アプリが最初にロード、私はデータをフェッチしていNSURLSessionTask WiFiオフ時にコールバックしない

NSLog(@"request-start"); 
NSURLRequest* request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:@"https://www.google.com"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:0]; 
task = [[NSURLSession sharedSession] dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { 
    NSLog(@"request-end"); 
}]; 
[task resume]; 

私の問題

。無線LANがオフになっている場合は、エラーを表示する必要があります。タイムアウトを設定すると、従うことになりますが、10秒以上かかる必要があり、待ち時間を長くしないでください。私はまた、到達可能性を持つネットワーク状態を検出しようとしましたが、アプリケーションが最初にロードされるとき、ネットワーク状態はしばしばunknownです。

+0

これは、共有セッションの使用のだろうか? – matt

+0

"しかし、10秒以上かかる必要があります。あなたの接続が応答を受け取るのに10秒かかる場合は、なぜタイムアウトを設定しないのですか?接続エラーとタイムアウトを処理するには、タイムアウトを設定する必要があります。たとえ "無線LANがオン"であっても、接続は100%動作しません。 「人を待たせる」ことに集中すべきではなく、接続に予想以上の時間がかかると、エラーとユーザーインターフェイスを処理して、ユーザーに進捗情報の情報を表示するようにしてください。 –

+0

@matt - 私は 'defaultSessionConfiguration'と' ephemeralSessionConfiguration'を試してみましたが、同じ結果を得ました – bendytree

答えて

1

timeoutIntervalForResource

このプロパティは、この構成に基づいて、セッション内のすべてのタスク のリソースタイムアウト間隔を決定します。リソースタイムアウト は、リソース全体が転送を待つ時間(秒)を、あきらめる前に制御します。リソースタイマーは、 要求が開始されたときに開始し、要求が完了するか、または このタイムアウト間隔がに到達するまでのいずれか早いほうに達するまで、をカウントします。

デフォルト値は7日間です。

timeoutIntervalForRequest

重要

元の要求が タイムアウトのために失敗した場合、バックグラウンドセッション によって作成された任意のアップロードまたはダウンロードタスクを自動的に再試行されます。 のアップロードまたはダウンロードタスクを再試行または転送できる期間を構成するには、 timeoutIntervalForResourceプロパティを使用します。

デフォルト値は、あなたの接続は、7日のために実行されます、あなたのタイムアウトを設定せず、だから、60

です。

何か問題が発生した場合、一般にNSURLSessionバックグラウンドセッションはタスクを失敗しません。むしろ、それは要求を実行するのに良い時間を 探し続け、その時に再試行します。これは、リソースのタイムアウト(セッションの作成に使用するNSURLSessionConfiguration オブジェクト内の timeoutIntervalForResourceプロパティの値)が終了するまで、 を続けます。その 値の現在のデフォルトは1週間です!

Source

+0

ありがとう@スニーク。私はそれが意図的に "要求を再試行する良い時間を待つ"ように設計されていたことを認識していませんでした。再試行するのを待たずにリクエストを行う方法はありますか? – bendytree

+0

@bendytree唯一の選択肢は次のとおりです:http://stackoverflow.com/questions/7938650/ios-detect-3g-or-wifi/7938778#7938778しかし、Appleのベストプラクティスとガイドラインは、到達可能性をチェックすることです* *後**適切なメッセージを表示するために接続エラーが発生した場合、すべての要求に対してではありません。しかし、私はあなたのユースケースが何であるか、私の友人が必要なのは分かりません。 GL、BTW、あなたはwierdのものへの実行を避けるために何が問題でもタイムアウトを設定する必要があります。 –

+0

ご協力いただきありがとうございます。基本的には、明らかに接続されていないときに、ユーザーがフルタイムアウト(わずか10秒)を待つことは望ましくありません。私はそれがiOSでは不可能だと思う。 – bendytree

関連する問題