我可以使用NSURLSessionUploadTask进行离线同步任务吗?

时间:2015-06-12 13:42:40

标签: ios objective-c swift

我需要类似于Facebook的离线发布功能。基本上我希望用户在设备上本地创建内容而不管连接状态如何,每当互联网变得可用时,它应该POST / PUT到服务器。

我在互联网上搜索了一个解决方案,我发现NSURLSessionUploadTask可以在后台用于POST。但我无法弄清楚是否支持以下方案:

  • 当用户离线时,我的任务是否会保留在后台队列中,并且操作系统会在重新连接网络时尝试执行队列中的项目吗?
  • 如果应用程序被用户强行关闭或崩溃会怎样?
  • 如果操作失败会怎样?

2 个答案:

答案 0 :(得分:1)

首先,后台NSURLSession仅允许文件上传。如果你没问题:

  • 任务将在队列中,直到收到服务器答案。
  • 如果您的应用已强制关闭,则任务仍将执行。请求完成后,您的应用将以非交互式后台状态启动并接收application:handleEventsForBackgroundURLSession:completionHandler:。处理完信号并调用完成处理程序或30秒超时后,应用程序将关闭。
  • 我操作失败,您将收到URLSession:task:didCompleteWithError:

背景NSURLSessions上有一个很好的tutorial。我建议你阅读这篇伟大文章的全部4部分 如果文件上传不是您的选项,我建议您将信息保存到本地数据库,然后等待可以访问互联网。 (这里的一个好方法是使用Reachability库,Alamofire也允许这样做。当互联网可用时,只需使用保存的数据调用您的http请求。

答案 1 :(得分:0)

我们遇到了内部应用程序的连接问题,因此我们编写了一个Swift框架,允许任何网络操作在设备访问互联网时排队并发送 -  https://cocoapods.org/pods/OfflineRequestManager。您仍然必须在符合OfflineRequest的对象中处理网络请求本身,但它听起来非常适合您的用例。

最简单的用例看起来如下所示,尽管大多数实际情况(保存到磁盘,特定请求数据等)都会有更多的环节要跳过:

import OfflineRequestManager

class SimpleRequest: OfflineRequest {
    func perform(completion: @escaping (Error?) -> Void) {
        doMyNetworkRequest(withCompletion: { response, error in
            handleResponse(response)
            completion(error)
        })
    }
}
///////
OfflineRequestManager.defaultManager(queueRequest: SimpleRequest())