发布于 2017-11-27 18:42:12
您在应用程序委托中实现了application:handleEventsForBackgroundURLSession:completionHandler:吗?它应该保存完成处理程序,并使用指定的标识符启动后台会话。
如果您不实现该方法,您的应用程序将不会被告知,如果下载完成后,应用程序已暂停(或随后终止在正常的应用生命周期)。因此,即使下载完成了,也可能看上去还没有完成。
(顺便提一下,如果用户强制退出应用程序,这不仅会终止下载,而且显然不会通知应用程序下载已经终止,直到用户稍后手动重新启动应用程序,然后应用程序重新实例化后台会话。这是一个次要的问题,你可能不会担心,直到你的主要背景处理工作,但这是一些需要注意的事情。
另外,您的URLSessionDidFinishEventsForBackgroundURLSession:必须调用保存的完成处理程序(并将其分派到主队列)。
而且,您的设计看起来一次只发出一个请求。(我建议您不要这样做,但让我们假设它就像您前面所描述的那样。)所以,让我们想象一下,您已经发出了第一个请求,应用程序在完成之前就被暂停了。然后,下载完成后,在后台重新启动应用程序,并调用handleEventsForBackgroundURLSession。让我们假设您已经修复了这个问题,以确保它重新启动后台会话,以便可以调用各种委托方法。确保在为第二个下载发出第二个请求时,要使用现有的后台会话,而不是实例化新的会话。每个标识符只能有一个后台会话。总之,背景会话的实例化应该与downloadWithURL:pathArr:mediaInfo:分离。只实例化一次后台会话。
发布于 2018-07-23 17:20:38
在.plist中添加“必需的后台模式”
在那里,添加"App从网络下载内容“项
https://stackoverflow.com/questions/47515873
复制相似问题