场景:
作为用户,我可以拍摄(无限量)存储在应用程序文档文件夹中的照片和视频。这些媒体文件中的每一个都会在 Sqlite 数据库中获得一条记录,其中包含附加信息(例如标题)。所有这些都可以完全离线完成。
重新上线后,我会看到一个对话框,其中列出了我拍摄的所有视频和照片,以及一个用于启动上传过程的按钮。
通过向服务器发出多部分 POST 请求,每个文件连同其元数据一起上传。服务器的响应与元数据一起存储在 Sqlite 数据库中(因此不会发生即发即弃的情况)。
可靠的解决方案?
如果我正在阅读和理解this chart正确地说,最简单的解决方案是将这些上传中的每一个都包装在一个任务中。副作用:10 分钟后每个任务都会被取消,这会因连接速度慢或文件非常大(例如非常长的视频)而成为问题。
推荐的方法是使用 NSUrlSession/后台传输服务。
这引出了我的问题:
是否可以将多部分 POST 包装在 NSURLSessionDataTasks 中,这是否可靠,即使任务运行时间超过 10 分钟或用户正在暂停应用程序?
因为我是一名 Xamarin/C# 开发人员,所以我非常感谢一些示例片段用于有效的分段上传,即使它是在 Objective-C 中;-)。
最佳答案
几乎……是的。
后台传输服务与 NSUrlSessionDownloadTask
配合使用s 和 NSUrlSessionUploadTask
仅。不是NSUrlSessionDataTask
s,如所述here .
除此“基本”限制外,使用后台传输服务处理上传任务是安全的。
后台 10 分钟免费通行证不再适用于 iOS 7(基本上,它存在,但有所不同),但是,NSURLSession
和后台传输服务,您不需要它。
我有一篇博文 here用于后台传输服务,基于下载任务。
需要注意的重要一点是,开始一项任务基本上意味着它实际上将在某个时间开始并在其他时间实际结束。这取决于设备是使用蜂窝网络还是 Wi-Fi 以及其他(可能)只有 iOS(和 Apple)知道的因素。
关于iOS7 后台同步(使用 NSURLSessionDataTask?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19710383/