NSURLSession 啥时候运行?
Posted
技术标签:
【中文标题】NSURLSession 啥时候运行?【英文标题】:When does NSURLSession run?NSURLSession 什么时候运行? 【发布时间】:2013-10-07 23:18:16 【问题描述】:我有一种情况,当设备收到推送通知时,我会发送NSURLSession
和NSURLConnection
。我有几个关于 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 啥时候运行?的主要内容,如果未能解决你的问题,请参考以下文章