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

Posted

技术标签:

【中文标题】我可以使用 NSURLSessionUploadTask 进行离线同步任务吗?【英文标题】:Can I use NSURLSessionUploadTask for offline syncing tasks? 【发布时间】:2015-06-12 13:42:40 【问题描述】:

我需要类似于 Facebook 的离线发帖功能的东西。基本上,我希望用户无论连接状态如何,都可以在设备上本地创建内容,并且只要互联网可用,它就应该 POST/PUT 到服务器。

我在互联网上搜索了一个解决方案,我发现NSURLSessionUploadTask 可用于在后台进行 POST-ing。但我不知道是否支持以下场景:

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

这确实回答了这个问题。希望有一种方法可以将后台会话用作我的私有 HTTP 队列:D。不过,我要走一条不同的路线,并尝试使用后台“获取”模式来实现这一点。 后台获取恐怕不是灵丹妙药。这是一个不错的功能,但是 ios 会根据用户的活动来决定应用程序何时可以接收到 fetch 信号,因此您可能永远不会收到它。另一种方法是定期从服务器发送静默推送通知,以便应用程序可以被唤醒并在后台执行一些操作。请参阅my other answer,了解如何从这种模式中获益以及它的基石。【参考方案2】:

我们的内部应用程序遇到了连接问题,因此我们编写了一个 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())

【讨论】:

以上是关于我可以使用 NSURLSessionUploadTask 进行离线同步任务吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 ScriptEditor、SharePoint 中使用 Json 吗?

我可以使用啥图表来显示 Html 事件和操作

HTML5 本地存储 - 我可以为每个键存储多个值,如果不能,我可以使用啥替代方案?

我可以从 WPF 窗口获取 HDC 以便我可以使用 Gdi+ API 绘制它吗?

我可以使用 Rails 制作 phongap 应用吗

我可以使用啥库在 C# 中处理 VoIP 流?