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文件下载