2

NSURLSessionDownloadタスクとバックグラウンド構成を使用して、一連のダウンロードを開始しNSURLSessionます。ほとんどの場合、すべて正常に動作しますが、コールバック メソッドlocationで指定された場所に一時ファイルがない場合があります。delegateシミュレータとデバイスの両方で発生します。コードは次のとおりですが、SimpleBackgroundTransfer サンプルがあるように、すべてが非常に単純に見えます。

 ....
for (NSUInteger i = 0; i < 10; i++) {
    NSString *downloadURLString = ...;
    NSURLSessionDownloadTask *task = [[self backgroundURLSession] downloadTaskWithURL:[NSURL URLWithString:downloadURLString]];
    [task resume];
}
 ....


- (NSURLSession *)backgroundURLSession
{
    static NSURLSession *session = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSString *identifier = @"com.yyy.backgroundTransfer";
        NSURLSessionConfiguration* sessionConfig = [NSURLSessionConfiguration         backgroundSessionConfiguration:identifier];
        session = [NSURLSession sessionWithConfiguration:sessionConfig
                                                delegate:self
                                           delegateQueue:[NSOperationQueue mainQueue]];
    });    

    return session;
}
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{
    NSLog(@"%s", __PRETTY_FUNCTION__);
    NSAssert([[NSFileManager defaultManager] fileExistsAtPath:[location path]], nil);
    /// This assert gets triggered every now and then. Any idea why? 
    /// And downloadTask.originalRequest in fact has a valid download URL and the status code for the response in downloadTask it is 200
}

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
     NSLog(@"%s", __PRETTY_FUNCTION__);
}

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
     NSLog(@"%s", __PRETTY_FUNCTION__);
}

また、奇妙なことは、この奇妙なことが発生したときに他のNSURLSessionDelegateメソッドが呼び出されURLSession:downloadTask:downloadTask:locationず、場所の URL にファイルがないことです (downloadTask.originalRequest実際には有効なダウンロード URL があり、downloadTask の応答のステータス コードは 200 です)。
この奇妙なことが発生すると、システムがファイルをまったく作成できないのと同じように、スケジュールされたすべてのダウンロードで発生します。URLSession:downloadTask:downloadTask:locationすぐに呼び出されます。
デバイス/シミュレーターを再起動すると、常に役立つようです。アプリを再起動しても解決しません。
誰かがこのようなことを経験しましたか?

4

0 に答える 0