后台情况
六.NSURLSession前台下载开始--------->切换后台----(下载未结束)----->切换前台--------->下载结束。
此时的调用与完全在前台执行相同。
七.NSURLSession前台下载开始--------->切换后台----(下载已结束)----->切换前台。
1.在下载过程中,NSURLSessionDownloadDelegate的
URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite (int64_t)totalBytesExpectedToWrite
接口会多次调用,在此接口中可进行下载进度的记录或更新UI的下载进度条。
2.切换后台。
3.后台的所有下载任务结束,此时会调用Appdelegate的
- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler
此方法中的completionhandler的block需要被变量引用,以备在后续方法中执行。
4.执行NSURLSessionDownloadDelegate的方法
- (void)URLSession:(NSURLSession *)session
downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location {
NSLog(@"------这是NSURLSessionDownloadDelegate 的 didFinishDownloadingToURL:location");
NSLog(@"downloadTask:%lu didFinishDownloadingToURL:%@", (unsigned long)downloadTask.taskIdentifier, location);
NSString *locationString = [location path];
NSString *finalLocation = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"%lufile",(unsigned long)downloadTask.taskIdentifier]];
NSError *error;
[[NSFileManager defaultManager] moveItemAtPath:locationString toPath:finalLocation error:&error];
// 用 NSFileManager 将文件复制到应用的存储中
// ...
// 通知 UI 刷新
}
此接口中的location参数记录下载的tmp文件的存储路径,在此接口中需将下载的tmp文件重新保存至最终的保存地址中。
5.调用NSURLSessionTaskDelegate的
URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
当下载成功时,error参数为nil。
6.当NSURLSessionTaskDelegate以及NSURLSessionDownloadDelegate的代理方法调用完成后调用NSURLSessionDelegate的方法
- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session {
NSLog(@"------这是NSURLSessionDelegate 的 URLSessionDidFinishEventsForBackgroundURLSession ");
NSLog(@"Background URL session %@ finished events.\n", session);
if (session.configuration.identifier) {
// 调用在 -application:handleEventsForBackgroundURLSession: 中保存的 handler
[self callCompletionHandlerForSession:session.configuration.identifier];
}
}
在该方法中待所有载数据管理和UI刷新做完后,再调用3中引用的completionHandler()的block。
八.NSURLSession前台下载开始--------->切换后台----(下载未结束)--------->下载失败----->切换前台。
九.NSURLSession前台下载开始--------->切换后台----(下载未结束)--------->退出应用----->应用重新打开--------->重新恢复下载--------->下载结束。
此过程同四中的NSURLSession前台下载开始--------->应用退出--------->应用重新打开--------->重新恢复下载--------->下载结束。
十.NSURLSession前台下载开始--------->切换后台----(下载未结束)--------->下载失败--------->退出应用----->应用重新打开--------->重新恢复下载--------->下载结束。
十一.NSURLSession前台下载开始--------->切换后台----(下载已结束)--------->退出应用---->应用重新打开。