iOS 7 - NSURLSession Resumable Uploads

时间:2013-10-01 10:28:31

标签: ios file-upload ios7 multipart nsurlsession

我目前正在设计一个系统,用于从应用程序将多个图像上传到服务器。这些文件将存储在本地设备上,当前的想法是将它们分成块,然后将它们逐块上传到服务器,在上传下一个之前等待成功消息。

此过程应该对用户是无缝的,他们应该按下按钮提交所有图像,然后关闭应用程序并使其在后台继续。在iOS 7中,我看到您可以将上传内容传递给新的NSURLSession API,并让它独立于您的应用程序处理上传任务。

我想知道是否有人知道这种转移有多可靠。如果我将整个图像传递给它,如果互联网连接中途下降会发生什么?后台传输服务是否会在以后重试?我们的想法是,我们可以上传一个图像,如果它在一半时间内失败,那么我们可以在以后重新开始连接时从那一点继续。

我们的一个想法是将文件拆分为块,然后将所有块作为单独的NSURLSessionUploadTasks传递,并假设它们最终都将被发送到服务器。

另一个是使用以下方式发送第一个块:

uploadTaskWithRequest:fromData:completionHandler:

然后在completitionHandler中发送下一个块。我的问题是,如果在后台,下一个块将具有其

@property BOOL discretionary = true

这意味着它只会在插入时通过WiFi发送。我需要这个才能在所有网络上工作并且能够应对中断。

我不想要任何代码,只是建议这是否是实现此目的的正确方法。

1 个答案:

答案 0 :(得分:7)

我会尝试回答你的一些问题

如果您的上传因错误而中途停止,您的应用应该在后台启动,您应该能够执行所需的错误处理。在您的情况下,如果您的服务器支持可恢复的上传,您应该能够获得偏移量,然后设置另一个任务来上传下一个块。

如果您使用配置为在后台运行的NSURLSession,那么您无法使用完成处理程序设置上传任务,并且您无法使用NSData对象上传您的块。您唯一的选择是将块写入磁盘,然后使用

uploadTaskWithRequest:fromFile:

我认为这是有道理的,因为NSData对象驻留在应用程序内存中,后台上传由外部守护程序执行,因此只能上传文件(来自用户的沙箱)。而不是使用完成处理程序,您将需要使用委托来监听回调(当应用程序在前台时)。

如果您仍然喜欢使用NSData对象,那么另一种解决方案是使用

创建任务
downloadTaskWithRequest:

通过这种方式,您可以在请求正文中设置NSData对象,并在请求中传递它。您需要使用NSURLMutableRequest设置您的请求才能实现此目的。

对于自由裁量财产,由于它违约为TRUE,我不确定我们是否可以做很多事情。它表示在Wi-Fi上进行传输更可能,并且在插入时因此可能会在蜂窝网络上发生的可能性很小,但我不会接受我的话,我只是在猜测。 / p>