バックグラウンド セッションを使用NSURLSessionDownloadTask
して、すべての REST 要求を達成しています。このようにして、アプリケーションがバックグラウンドまたはフォアグラウンドにあることを考える必要なく、同じコードを使用できます。
私のバックエンドはしばらく機能していませんでした。その機会を利用してNSURLSession
、タイムアウトで がどのように動作するかをテストしました。
まったく驚いたことに、私のNSURLSessionTaskDelegate
コールバックはまったく呼び出されません。NSURLRequest
または でどのようなタイムアウトを設定しNSURLSessionConfiguration
ても、リクエストがタイムアウトで終了したことを通知する iOS からのコールバックを受け取ることはありません。
つまりNSURLSessionDownloadTask
、バックグラウンド セッションを開始したときです。アプリケーションがバックグラウンドでもフォアグラウンドでも同じ動作が発生します。
サンプルコード:
- (void)launchDownloadTaskOnBackgroundSession {
NSString *sessionIdentifier = @"com.mydomain.myapp.mySessionIdentifier";
NSURLSessionConfiguration *backgroundSessionConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:sessionIdentifier];
backgroundSessionConfiguration.requestCachePolicy = NSURLRequestReloadIgnoringCacheData;
backgroundSessionConfiguration.timeoutIntervalForRequest = 40;
backgroundSessionConfiguration.timeoutIntervalForResource = 65;
NSURLSession *backgroundSession = [NSURLSession sessionWithConfiguration:backgroundSessionConfiguration delegate:self delegateQueue:[NSOperationQueue mainQueue]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.timeout.com/"]];
request.timeoutInterval = 30;
NSURLSessionDownloadTask *task = [backgroundSession downloadTaskWithRequest:request];
[task resume];
}
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
NSLog(@"URLSession:task:didCompleteWithError: id=%d, error=%@", task.taskIdentifier, error);
}
ただし、デフォルトのセッションを使用すると、30 秒 (リクエスト レベルで設定したタイムアウト) 後にエラー コールバックが返されます。
サンプルコード:
- (void)launchDownloadTaskOnDefaultSession {
NSURLSessionConfiguration *defaultSessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];
defaultSessionConfiguration.requestCachePolicy = NSURLRequestReloadIgnoringCacheData;
defaultSessionConfiguration.timeoutIntervalForRequest = 40;
defaultSessionConfiguration.timeoutIntervalForResource = 65;
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration:defaultSessionConfiguration delegate:self delegateQueue:[NSOperationQueue mainQueue]];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.timeout.com/"]];
request.timeoutInterval = 30;
NSURLSessionDownloadTask *task = [defaultSession downloadTaskWithRequest:request];
[task resume];
}
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error {
NSLog(@"URLSession:task:didCompleteWithError: id=%d, error=%@", task.taskIdentifier, error);
}
バックグラウンド セッションを使用する場合、タイムアウトの動作が異なることを示唆するドキュメントを見つけることができないようです。
誰もその問題にぶつかりましたか? それはバグですか、それとも機能ですか?
バグ レポートの作成を検討していますが、通常、バグ レポーター (6 か月) よりも SO (数分) の方がずっと早くフィードバックを得ることができます。
よろしく、