NSURLSession在iOS 7.0.x上挂起

时间:2014-03-21 12:57:27

标签: ios iphone ios7 nsurlsession nsurlsessiondownloadtask

我们已配置NSULRSession

- (NSURLSession *)downloadSession
{
    static NSURLSession *session = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{

        NSOperationQueue *delegateQueue = [[NSOperationQueue alloc] init];

        NSString *identifier = ORDERS_DOWNLOADER_SESSION_IDENTIFIER;
        NSURLSessionConfiguration* sessionConfig = [NSURLSessionConfiguration backgroundSessionConfiguration:identifier];
        session = [NSURLSession sessionWithConfiguration:sessionConfig
                                                                delegate:self
                                                           delegateQueue:delegateQueue];
    });

    return session;
}

在iOS 7.0.x上没有构建SDK 7.0和7.1。 问题没有出现在iOS 7.1上。

我们经常可以看到以下内容:

  • 开始执行后台下载

    [AppDelegate应用程序:performFetchWithCompletionHandler:]

  • 但是30秒后我们没有回复代表。

我们已实施

 - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error

 - (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session

 - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location

 - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes

 - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
willPerformHTTPRedirection:(NSHTTPURLResponse *)response
        newRequest:(NSURLRequest *)request
 completionHandler:(void (^)(NSURLRequest *))completionHandler

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
 needNewBodyStream:(void (^)(NSInputStream *bodyStream))completionHandler

- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
   didSendBodyData:(int64_t)bytesSent
    totalBytesSent:(int64_t)totalBytesSent
totalBytesExpectedToSend:(int64_t)totalBytesExpectedToSend
  • 我们没有任何回调。

可能有什么问题? 它看起来像iOS 7.0.x的问题。有没有好的解决方法?

1 个答案:

答案 0 :(得分:0)

这是iOS的问题

更多信息: https://devforums.apple.com/message/926113#926113

任何解决方案/解决方法?我看到了同样的问题。

使用基本[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@" ..."]]和-downloadTaskWithRequest进行测试:

有几点意见:

  1. 应用程序第一次调用-downloadTaskWithRequest:它运行正常。

  2. 后续调用-downloadTaskWithRequest:返回nil,直到应用程序被杀。

  3. 现在我们只有一个解决方法: 多次调用任务创建方法。它对我们有用! 通常它会影响第二次。

    _task = [[self downloadSession] downloadTaskWithRequest:request completionHandler:nil];
    
    // Workaround to solve issue https://devforums.apple.com/message/926113
    // Occurs consistently on iOS 7.0.5 and lower
    // Sometimes _task may not be initialized, so we try again:
    if (!_task)
    {
        for (int i = 0; i < 5; i++)
        {
            NSLog(@"%s, attempt #%d to recreate download task", __func__, i + 1);
    
            _task = [[self downloadSession] downloadTaskWithRequest:request completionHandler:nil];
            if (_task)
            {
                break;
            }
        }
    }