有没有办法(可能是库?)在用户离线时存储 HTTP POST 请求,然后在用户重新在线时传输 POST 请求?
(我不需要阅读服务器的响应,除非我想在 POST 请求失败时重新排队请求。)
有没有办法(可能是库?)在用户离线时存储 HTTP POST 请求,然后在用户重新在线时传输 POST 请求?
(我不需要阅读服务器的响应,除非我想在 POST 请求失败时重新排队请求。)
是的,有这样一个库:
http://blog.mugunthkumar.com/products/ios-framework-introducing-mknetworkkit/
它对您的应用程序的退出和重新启动具有弹性,并且会继续尝试发送您的请求,直到出现持续故障(例如服务器关闭,而不是网络关闭)
有没有办法(可能是库?)在用户离线时存储 HTTP POST 请求,然后在用户重新在线时传输 POST 请求?
我认为最好的办法是存储发出每个请求所需的信息,而不是存储请求本身。如果将每个请求的数据包装在可归档对象中,则可以将这些对象添加到要发送的队列中。这样,如果应用程序关闭,您可以将整个队列(您可以对队列使用可变数组)归档到文件中,并在应用程序再次启动时将其读回。将队列用作单独操作的输入,该操作除了从队列中获取对象并在设备在线时发送相应的请求外什么都不做。
在 iOS 7 中,NSURLSession可以做到。当应用程序停止运行时,它甚至可以在后台运行请求。
在这里聚会已经很晚了,但我为我们的内部应用程序编写了一个 pod,它几乎可以做到这一点 - https://cocoapods.org/pods/OfflineRequestManager。实际的网络请求仍然由符合 OfflineRequest 协议的任何东西处理,但是 pod 提供了一种简单的方法来将请求排入队列并确保它们继续尝试执行直到成功,包括保存到磁盘。
最简单的用例如下所示,尽管大多数实际用例(保存到磁盘、特定请求数据等)将有更多的障碍需要跳过:
import OfflineRequestManager
class SimpleRequest: OfflineRequest {
func perform(completion: @escaping (Error?) -> Void) {
doMyNetworkRequest(withCompletion: { response, error in
handleResponse(response)
completion(error)
})
}
}
///////
OfflineRequestManager.defaultManager(queueRequest: SimpleRequest())