以前は、iOS7 でストリーム リクエストをバックグラウンドでアップロードしようとすると、次の例外が発生しました。
キャッチされていない例外 'NSGenericException' が原因でアプリを終了しています。理由: 'バックグラウンド セッションのアップロード タスクはファイルから実行する必要があります'
しかし iOS8 では、ストリームをバックグラウンドでアップロードしようとすると例外はありません。
今私の質問は
1) uploadTaskWithStreamedRequest:を使用した backgourd アップロードは iOS8 で許可されていますか?
2) iOS8 では、 uploadTaskWithStreamedRequestでバックグラウンド NSURLConfiguration を使用しています。-(void) URLSession :(NSURLSession *)session task:(NSURLSessionTask *)task needNewBodyStream:(void (^)(NSInputStream *))completionHandlerを使用して、NSUrlSession にストリームを提供しています。アプリがフォアグラウンドにある場合、アプリは正常に機能しており、ファイルをサーバーにアップロードしています。ただし、アプリがバックグラウンドで動作するとすぐにストリームが終了し、NSURLSession が次のエラーで完了します。
エラー Domain=NSURLErrorDomain Code=-997 「バックグラウンド転送サービスへの接続が失われました」
アプリがバックグラウンドになると、ストリームが終了すると思います。ここで私の質問は、どのランループでストリームをスケジュールするか、私の理解に間違いがあるかどうかを知らせるべきかということです。
-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task needNewBodyStream:(void (^)(NSInputStream *))completionHandler
{
// Open producer/consumer streams. We open the producerStream straight
// away. We leave the consumerStream alone; NSURLConnection will deal
// with it.
NSLog(@"%@", [NSThread currentThread]);
NSInputStream *consStream;
NSOutputStream *prodStream;
[NSStream createBoundInputStream:&consStream outputStream:&prodStream bufferSize:SFAMaxBufferLength];
assert(consStream != nil);
assert(prodStream != nil);
self.consumerStream = consStream;
self.producerStream = prodStream;
self.producerStream.delegate = self;
[self.producerStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
[self.producerStream open];
// Set up our state to send the body prefix first.
self.buffer = [self.bodyPrefixData bytes];
self.bufferLimit = [self.bodyPrefixData length];
completionHandler(self.consumerStream);
}