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

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

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

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

【问题讨论】:

  • 如果是数据任务,则不允许在后台运行

标签: ios push-notification nsurlconnection 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并查找“简单后台传输”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-18
        • 1970-01-01
        • 2016-09-17
        相关资源
        最近更新 更多