在我的应用程序中,我在后台使用了NSURLSessionDownloadTask
。当应用程序处于前台时,我将恢复一个下载任务。稍后,当应用程序再次处于后台时,该下载任务将完成,并且在功能didCompleteError
中,我希望在应用程序仍处于后台时创建另一个下载任务。但下载任务不运行。谁能帮我?ios - 在后台创建会话下载任务
回答
试试这个代码:
-(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
,我们创建一个会话,而是有多个任务。
所以,让我们定义我们的会议:
NSURLSessionConfiguration* config = [NSURLSessionConfiguration backgroundSessionConfiguration:@“myUniqueAppID”];
_session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
我们正在做的第一,是创建一个配置,这将允许它在后台运行。该配置需要一个专用于您的应用的唯一标识符。使用应用程序的包标识符是很好的做法,比如com.yourCompany.appName
一旦我们有了我们的配置,我们就可以实例化我们的会话,在那里我们传递给委托的引用以及我们希望它运行的队列。你最喜欢的将会是这个mainQueue。
有关此主题的目的,我们将只黏合下载任务。所以,一旦你知道该网址,您要下载的文件,你可以通过你的会话创建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文件的基础知识。
我希望你觉得这个有用!
感谢您的帮助。我的应用程序运行良好,与您的指南相同的代码。 。但我想问在后台应用程序,我恢复另一个下载任务。在模拟器上,下载任务恢复正常,但在设备上,下载任务不能恢复。 – AChen
如果此代码对您有帮助,请接受我的回答。 –
设备中发生了什么错误? –
- 1. iOS上的后台任务
- 2. 创建循环后台任务
- 3. nhibernate当前会话在后台线程上创建后丢失
- 4. 从NSData上传任务不支持在后台会话
- 5. Rails如何为heroku上的rake任务创建后台任务?
- 6. 如何创建rake任务的后台任务?
- 7. iOS SDK注销后台和会话
- 8. Phonegap后台任务
- 9. Swift - 在后台下载NSURLSession?
- 10. iOS后台任务/推送通知
- 11. AVAudioPlayer后台任务不工作[的iOS]
- 12. iOS中的经常性后台任务
- 13. 使用NSURLSessionDataTask的iOS后台任务
- 14. iOS的后台任务没有完成
- 15. NSOperation和NSOperationQueue的后台任务iOS
- 16. iOS上的后台任务计时器
- 17. 如何在.NET MVC中为后台任务创建专用任务?
- 18. 在iOS中下载大量文件在后台iOS
- 19. 关于创建PHP-MySQL后台任务的建议
- 20. UWP PushNotificationTrigger不会触发后台任务
- 21. 在android中创建后台服务
- 22. 在Android中创建后台服务
- 23. System.UnauthorizedAccessException的在后台任务
- 24. NSRunLoop后台任务有效
- 25. 创建会话使iOS应用崩溃
- 26. Java(FX)用户界面更新和(后台)下载任务
- 27. 嵌套REQUIRES_NEW事务后,hibernate会创建新会话吗?
- 28. linux:kill后台任务
- 29. java后台任务
- 30. nodejs后台任务
你需要在你的问题中包含相关的代码。 – ajshort
in func didCompleteError,我创建了下载任务: dispatch_async(dispatch_get_main_queue(),^ { NSURLSessionDownloadTask * downloadTask = [self.session downloadTaskWithResumeData:movie。resumeData]; [downloadTask resume]; }); 当我在模拟器或Xcode设备上调试时,下载任务恢复。但在没有xcode的设备上运行,下载任务不运行。 – AChen