NSURLSession didFinishDownloadingToURL 临时下载文件未找到

Posted

技术标签:

【中文标题】NSURLSession didFinishDownloadingToURL 临时下载文件未找到【英文标题】:NSURLSession didFinishDownloadingToURL temporary downloaded file not found 【发布时间】:2015-03-04 16:47:38 【问题描述】:

我在代理方法 didFinishDownloadingToURL 上遇到了一个奇怪的 NSURLSession 问题。

我要做的第一件事是检查临时下载的文件是否存在:

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

    if (![[NSFileManager defaultManager] fileExistsAtPath: [location path]])
    
        NSLog(@"Error. File not found");
        return; // is giving error when the app is wake up by the system
    
    ...

当应用程序处于前台并下载完成时,它可以正常工作。但是当app在后台被操作系统强杀时,返回false。

有人知道可能发生的事情吗?我知道当应用程序被操作系统唤醒时执行此委托方法有时间限制,因为临时文件不存在是没有意义的。我什至无法将其复制到其他位置... 因为文件的大小而有意义吗?我正在下载一个 +-130MB 的文件。

谢谢。

【问题讨论】:

我也有同样的问题。提交了错误报告openradar.appspot.com/radar?id=4943165404479488 尝试打开 URL。由于与应用沙箱相关的一些怪癖,fileExistsAtPath 调用可能对您说谎。 有类似的问题。 location 指向不存在的文件。它不经常发生。有点烦。我想知道这个错误是否会导致电池寿命下降,因为该文件将被再次下载。如果位置再次错误,则再次下载......等等。 我也有同样的问题,但是使用 Swift 3 和 FileManager.copyItem(at:to:) 会抛出错误“文件“CFNetworkDownload_V2oQ2o.tmp”不存在。”而不是fileExistsAtPath: 返回false 我将其作为位置 /var/mobile/Library/Caches/com.apple.nsurlsessiond/Downloads‌​‌​/com.xxxxxxx/CFNet‌​wo‌​rkDownload_uFBpq‌​p.tm‌​p ,但归档不存在那里。当前修复它的唯一方法是重新启动设备,然后下载似乎在完成时存在 【参考方案1】:

我通过在卸载应用后安装应用解决了同样的问题。当网络会话工作时发生强制关闭时,NSURLSession 似乎会在系统上留下碎片。

【讨论】:

我正在模拟器上的框架项目(不是应用程序)上运行单元测试目标,因此不确定如何尝试您的解决方案。我在setUp()tearDown()使会话... 我将其作为位置 /var/mobile/Library/Caches/com.apple.nsurlsessiond/Downloads‌​/com.xxxxxxx/CFNetwo‌​rkDownload_uFBpqp.tm‌​p 我看到相同的行为在 ios 10.3.2 上。当前修复它的唯一方法是重新启动设备【参考方案2】:

来自Apple Docs:

(location is..) "临时文件的文件 URL。由于该文件是临时文件,因此您必须打开文件进行读取或将其移动到应用程序沙箱容器目录中的永久位置,然后再从这个委托方法。

如果您选择打开文件进行读取,您应该在另一个线程中进行实际读取以避免阻塞委托队列。"

【讨论】:

在给出的示例中,“在从这个委托方法返回之前”访问了文件——问题是它不存在。 Apple 文档在正常情况下是准确的,但在上述情况下并非如此。

以上是关于NSURLSession didFinishDownloadingToURL 临时下载文件未找到的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发系列-NSURLSession

学习NSURLSession

NSURLSession各文件关系

iOS开发-NSURLSession

NSURLSession学习

iOS开发 GETPOST请求方法:NSURLSession篇