NSURLSession 啥时候运行?

Posted

技术标签:

【中文标题】NSURLSession 啥时候运行?【英文标题】:When does NSURLSession run?NSURLSession 什么时候运行? 【发布时间】:2013-10-07 23:18:16 【问题描述】:

我有一种情况,当设备收到推送通知时,我会发送NSURLSessionNSURLConnection。我有几个关于 NSURLSession 的问题。

如果互联网连接中断,NSURLSession's 数据任务是否会在后台自动恢复?

如果最初没有互联网,NSURLSession 是否会自动尝试完成任务,还是会话只是返回错误?

【问题讨论】:

如果是数据任务,则不允许在后台运行 【参考方案1】:

看来是由你来处理重试。

当任何任务完成时,NSURLSession 对象调用委托的 URLSession:task:didCompleteWithError: 有错误的方法 object,如果任务成功完成,则返回 nil。如果任务是 可恢复下载任务,NSError 对象的 userInfo 字典 包含 NSURLSessionDownloadTaskResumeData 键的值。您的 应用程序应使用可达性 API 来确定何时重试,以及 然后应该调用 downloadTaskWithResumeData: 或 downloadTaskWithResumeData:completionHandler: 创建一个新的下载 任务以继续下载。转到第 3 步(创建和恢复 任务对象)。

https://developer.apple.com/library/ios/documentation/cocoa/Conceptual/URLLoadingSystem/NSURLSessionConcepts/NSURLSessionConcepts.html

【讨论】:

【参考方案2】:

如果网络断开,NSURLSession 的数据任务会在后台自动恢复吗?

如果 Internet 连接丢失,您将在委托方法 URLSession:task:didCompleteWithError 中收到错误 NSURLErrorNetworkConnectionLost(错误代码:-1005)。您负责使用 invalidateAndCancel 或 finishAndInvalidate 重试和/或使会话无效(尽管在网络连接丢失的情况下它已经完成)。

如果最初没有互联网,NSURLSession 会自动尝试完成任务,还是会话只是返回错误?

如果没有互联网连接,您将在委托方法URLSession:task:didCompleteWithError 中收到错误NSURLErrorNotConnectedToInternet(错误代码:-1009)。您负责使用 invalidateAndCancel 或 finishAndInvalidate 使会话无效(如果需要)(尽管在没有互联网连接的情况下它已经完成)。

参考资料:

URL Loading System Programming Guide

Foundation Constants Reference

【讨论】:

【参考方案3】:

如果您在 NSURLSession 中使用后台配置,当您的应用程序处于活动状态或在后台时,代理会在成功/失败时被调用。 您创建的任务被移交给操作系统的恶魔,您的应用程序正在使用

被唤醒甚至启动(如果它被 iOS 杀死)
`application:handleEventsForBackgroundURLSession:completionHandler`:

当所有任务完成后,您的会话委托将被调用

URLSessionDidFinishEventsForBackgroundURLSession:   

后台会话的更多细节是here

您也可以获取苹果示例代码here并查找“简单后台传输”

【讨论】:

以上是关于NSURLSession 啥时候运行?的主要内容,如果未能解决你的问题,请参考以下文章

NSURLSession 上传任务超时

使用NSURLSession同步获取数据(通过添加信号量)

NSURLSession 后台下载不起作用

NSURLSession 超时

NSURLSession的基本使用

关于网络NSURLSession