首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier :在将应用程序推入后台后停止下载

NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier :在将应用程序推入后台后停止下载
EN

Stack Overflow用户
提问于 2017-11-27 16:44:18
回答 2查看 1.2K关注 0票数 3
  1. 此方法设置背景对象。
  • (void) backgroundSessionConfigurationWithIdentifier:@"XXXXX";downloadWithURL:(NSMutableArray *)urlArray pathArr:(NSMutableArray *)pathArr mediaInfo:(MediaInfo *)mInfo { bgDownloadMediaInfo = mInfo;reqUrlCount = urlArray.count;dict = NSDictionary dictionaryWithObjects:pathArr forKeys:urlArray;mutableDictionary = dict mutableCopy;mutableDictionary=mInfo= YES;= YES;backgroundSession = [NSURLSession sessionWithConfiguration: backgroundConfigurationObject委托: self delegateQueue: NSOperationQueue currentQueue];self.requestUrl = urlArray objectAtIndex:0;download = backgroundSession downloadTaskWithURL:self.requestUrl;下载简历;}
  1. 这些是完成处理程序。 #语用标记-( NSURLSessionDownloadDelegate )URLSession:(NSURLSession *)会话downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)位置{LogDebug(@“下载完成请求url (%@)",downloadTask.currentRequest.URL);NSString *temp = mutableDictionary objectForKey:downloadTask.currentRequest.URL;NSString *localPath = NSString stringWithFormat:@ @"%@",temp;NSFileManager *fileManager = NSFileManager defaultManager;NSURL *destinationURL = NSURL:;error** nil;moveItemAtURL:location :destinationURL:&error;LogDebug(@“将下载文件移动到url:(%@)到:(%@)",downloadTask.currentRequest.URL,destinationURL);reqUrlCount -;downloadSegment ++;//切换剩余的下载请求,如果(finalUrlArr count != 0) { //从已下载的数组中删除请求。finalUrlArr removeObjectAtIndex:0;finalPathArr removeObjectAtIndex:0;if (finalUrlArr计数> 0) { //继续上的下一个请求。self.requestUrl = finalUrlArr objectAtIndex:0;download = backgroundSession downloadTaskWithURL:self.requestUrl;下载简历;}}如果(adsArray计数> 0) { adsArrayCount -;//委托返回到下载完所有ADs段之后。若(adsArrayCount == 0) { for (int i= 0;i< adsArray count;i++) { NSArray *ad = adsArray objectAtIndex: i;for (int j= 0;j
  2. 有了这个code(beginBackgroundTaskWithExpirationHandler),当应用程序被推入后台时,下载就停止了。 // AppDelegate_Phone.m - (void)applicationDidEnterBackground:(UIApplication *)应用程序{ NSLog(@"applicationDidEnterBackground");UIApplication *app = UIApplication sharedApplication;UIBackgroundTaskIdentifier bgTask;bgTask = [app入门背景UIBackgroundTaskIdentifier:^{ app endBack基底任务:bgTask;}];
EN

回答 2

Stack Overflow用户

发布于 2017-11-27 18:42:12

您在应用程序委托中实现了application:handleEventsForBackgroundURLSession:completionHa‌​ndler:吗?它应该保存完成处理程序,并使用指定的标识符启动后台会话。

如果您不实现该方法,您的应用程序将不会被告知,如果下载完成后,应用程序已暂停(或随后终止在正常的应用生命周期)。因此,即使下载完成了,也可能看上去还没有完成。

(顺便提一下,如果用户强制退出应用程序,这不仅会终止下载,而且显然不会通知应用程序下载已经终止,直到用户稍后手动重新启动应用程序,然后应用程序重新实例化后台会话。这是一个次要的问题,你可能不会担心,直到你的主要背景处理工作,但这是一些需要注意的事情。

另外,您的URLSessionDidFinishEventsForBackgroundURLSession:必须调用保存的完成处理程序(并将其分派到主队列)。

而且,您的设计看起来一次只发出一个请求。(我建议您不要这样做,但让我们假设它就像您前面所描述的那样。)所以,让我们想象一下,您已经发出了第一个请求,应用程序在完成之前就被暂停了。然后,下载完成后,在后台重新启动应用程序,并调用handleEventsForBackgroundURLSession。让我们假设您已经修复了这个问题,以确保它重新启动后台会话,以便可以调用各种委托方法。确保在为第二个下载发出第二个请求时,要使用现有的后台会话,而不是实例化新的会话。每个标识符只能有一个后台会话。总之,背景会话的实例化应该与downloadWithURL:pathArr:mediaInfo:分离。只实例化一次后台会话。

票数 1
EN

Stack Overflow用户

发布于 2018-07-23 17:20:38

在.plist中添加“必需的后台模式”

在那里,添加"App从网络下载内容“项

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47515873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档