NSUrlSessionDownloadTask - 进入后台时出现didCompleteWithError

Posted

技术标签:

【中文标题】NSUrlSessionDownloadTask - 进入后台时出现didCompleteWithError【英文标题】:NSUrlSessionDownloadTask - didCompleteWithError when go in background 【发布时间】:2014-09-11 12:46:02 【问题描述】:

当我通过按电源按钮强制我的设备进入睡眠模式时,我的后台任务通过调用委托方法 didCompleteWithError 停止并出现错误:

操作无法完成。不允许操作

如何配置我的 NSURLSession 以在睡眠模式下继续下载?

有可能吗?如果没有,我有什么选择?我需要下载一个 300Mb 的文件,因此如果连接不足,应用程序将在下载结束前进入睡眠模式。

这是我的会话的创建:

static NSURLSession *backgroundSession;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^
   backgroundSession = [NSURLSession sessionWithConfiguration:
                       [NSURLSessionConfiguration backgroundSessionConfiguration:
                       @"com.myapp.mytask"] delegate:self.
                       myDelegate delegateQueue:self.myQueue];
);

NSURLSessionDownloadTask *task = [backgroundSession downloadTaskWithRequest:
                                  self.urlRequest];
[task resume];

【问题讨论】:

锁定设备时下载不会直接停止。错误在 5-10 秒后到达。 我已经设法在我们的项目中使用***.com/a/32821437/1905256 的技术解决了这个问题。 【参考方案1】:

问题是数据保护功能被激活了。启用该功能后,所有文件都默认以NSFileProtectionComplete 存储,即使是NSURLSession 用于下载的临时文件:

默认的保护级别是完全保护,其中文件 设备锁定时已加密且无法访问。你可以 以编程方式为您创建的文件设置保护级别 应用程序,如 ios 中的“使用磁盘加密保护数据”中所述 应用编程指南。

在该文件上激活NSFileProtectionComplete 后,当设备被锁定时,您将无法访问它。

我不确定临时下载文件是否可以配置为不使用数据保护,似乎NSURLSession没有公开。

来源:App Distribution Guide

【讨论】:

NSURLSession 后台下载通过将下载交给 nsnetworkd 来工作,nsnetworkd 是一个后台守护进程,代表您继续下载工作。如果您正确使用它们,则不需要在后台运行您的应用程序。即使您的应用被暂停,它们也会继续。 感谢您的信息。我还没有广泛使用 NSURLSession。还有其他线索可能出了什么问题? 我进行了新测试,似乎只有当我通过我的 MDM 在内部部署我的应用程序时才会遇到这个问题。如果我直接从设备上的 xCode 运行应用程序:它可以工作。但是当我从我的 MDM 安装应用程序并运行它时,每次应用程序在后台运行超过 10 秒:它就会停止。 此时我真的只是在猜测。也许您的 MDM 策略要求在屏幕锁定时对所有/大多数文件进行加密(使用 NSFileProtection),因此当屏幕锁定时下载守护程序不能再写入加密文件?再一次,只是猜测。 是否有可能因为数据保护被激活而出现问题?我刚刚用一个没有数据保护的新配置文件做了一个例子,这次它似乎工作了。

以上是关于NSUrlSessionDownloadTask - 进入后台时出现didCompleteWithError的主要内容,如果未能解决你的问题,请参考以下文章

NSURLSessionDownloadTask 进度回调不顺畅?

在 NSMutableDictionary 中设置 NSURLSessionDownloadTask

NSUrlSessionDownloadTask - 进入后台时出现didCompleteWithError

iOS开发之网络编程--2NSURLSessionDownloadTask文件下载

NSURLSessionDownloadTask 在挂起时继续下载

在下载字节时从 NSURLSessionDownloadTask 访问字节