ios - 在后台创建会话下载任务

时间:2016-01-13 02:33:27

标签: ios objective-c background nsurlsessiondownloadtask

在我的应用程序中,我在后台使用NSURLSessionDownloadTask。当应用程序在前台时,我恢复一个下载任务。稍后,当应用程序再次处于后台时,该下载任务完成,并且在函数didCompleteError中,我想在应用程序仍处于后台时创建另一个下载任务。但是下载任务不会运行。任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

试试这段代码:

-(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 didCompleteWithError:(NSError *)error


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


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

NSURLConnection不同,我们通常使用NSURLSession为每个请求创建一个连接,我们创建一个会话,而不是多个任务。

所以我们定义一下Session:

NSURLSessionConfiguration* config = [NSURLSessionConfiguration backgroundSessionConfiguration:@“myUniqueAppID”];
_session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];

我们首先要做的是创建一个允许它在后台运行的配置。配置需要特定于您的应用的唯一标识符。最好使用应用的包标识符,例如com.yourCompany.appName

一旦我们有了配置,我们就可以实例化我们的会话,在那里我们传递对我们的委托的引用以及我们希望它运行的队列。你最希望这是mainQueue。

出于本主题的目的,我们将仅处理下载任务。因此,一旦您拥有要下载的文件的URL,就可以通过会话创建downloadTask:

NSURLSessionDownloadTask* task = [_session downloadTaskWithRequest:request];

[task resume];

现在,NSURLSession的工作方式是将文件直接下载到临时目录。所以你不必担心存储它。

在下载时,它会通知您已下载了多少,这对于通知您的用户下载进度非常有用:

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
{
   CGFloat percentDone = (double)totalBytesWritten/(double)totalBytesExpectedToWrite;
   // Notify user.
}

下载文件后,将调用以下方法:

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location
{
   // Either move the data from the location to a permanent location, or do something with the data at that location.
}

该方法的最后一个参数是数据下载到的位置。从这里,您可以将文件移动到可以使用它的永久位置,或者您可以访问数据并使用它执行某些操作。但是,这些数据不会留在那里,所以如果你真的需要它,请确保你不要离开它。

值得注意的是,任务就像NSURLConnection一样可以取消:

[_currentTask cancel];

关于使用NSURLSession下载文件的基础知识。

我希望你发现这很有用!