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

7
我需要类似Facebook离线发布功能的东西。基本上我希望用户可以在设备上本地创建内容,而不受连接状态的影响,只要有网络连接,它就会发出POST/PUT请求到服务器。
我在互联网上搜索了解决方案,并发现NSURLSessionUploadTask可用于后台POST请求。但我不确定以下情况是否得到支持:
  • 如果用户离线,我的任务是否仍然保留在后台队列中,操作系统是否在重新连接网络时尝试执行队列中的项目?
  • 如果用户强制关闭或应用程序崩溃会发生什么?
  • 如果操作失败会发生什么?
2个回答

2
首先,背景NSURLSession只允许文件上传。如果这对你来说可以接受:
- 任务将在队列中等待,直到收到服务器的回复。 - 如果您的应用程序被强制关闭,任务仍将执行。当请求完成时,您的应用程序将以非交互式后台状态启动,并接收application:handleEventsForBackgroundURLSession:completionHandler:。处理信号并调用完成处理程序或30秒超时后,应用程序将关闭。 - 如果操作失败,您将收到URLSession:task:didCompleteWithError: 关于后台NSURLSession,有一个很好的教程,建议阅读这篇伟大文章的所有4个部分。
如果文件上传对您不可行,建议您将信息保存到本地数据库中,然后等待网络连接。 (在这里一个好的方法是使用Reachability库,Alamofire也允许这样做)。当网络可用时,只需使用保存的数据调用您的HTTP请求即可。

这确实回答了问题。本来希望有一种方法可以将后台会话用作我的私人HTTP队列:D。不过我现在走了另一条路,尝试使用后台“fetch”模式来实现这个功能。 - Hless
抱歉,后台获取并不是答案。这是一个不错的功能,但iOS会根据用户活动决定何时向应用程序发送获取信号,因此您可能永远无法收到它。另一种方法是定期从服务器发送静默推送通知,以便可以唤醒应用程序并在后台执行某些操作。请参见我的其他回答,了解如何获得此模式的好处及其要点。 - Sega-Zero

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())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接