是否会通过NSURLSessionUploadTask保存临时文件

时间:2016-05-18 20:55:26

标签: ios nsurlsession temp nsurlsessionuploadtask

我正在实施一个可恢复的上传协议,该协议在iOS上的后台上传,这意味着我必须在文件中使用NSURLSessionUploadTask。由于它是一个可恢复的上传协议,因此需要根据服务器已经收到的数据截断该文件,因此我需要将一个新的临时文件保存到只有要在其中上传的字节的磁盘上

如果我可以在tmp//Library/Caches/中创建该临时上传文件,我是否可以相信只要NSURLSession正在运行就会保留该文件?

编辑:当上传失败时,服务器将保存已收到的字节并将其传送给客户端。然后客户端应该只发送文件的一部分,这就是为什么我需要创建一个小的临时文件,不能在上传中删除。

2 个答案:

答案 0 :(得分:0)

咦?您提供整个文件,系统负责管理部分上载/下载,并在传输完成后通知您。如果是下载,请在下载完成后向您发送临时文件,并且必须将其保存到永久位置。

你根本不应该使用部分文件。

编辑:

除了通过沙箱,您无法访问tmp/Library/Caches/。您可以通过调用

访问caches目录
[NSSearchPathForDirectoriesInDomains(
  NSCachesDirectory, 
  NSUserDomainMask, YES) lastObject];

我的理解是,caches目录只在重新启动时被清除,或者如果设备的空间严重不足,但我似乎记得文件很清楚,确切地说,caches目录何时被清除

您可能最好将文件保存到文档目录,然后在完成后将其删除。

答案 1 :(得分:0)

您的问题的答案是否定的。 NSURLSessionUploadTask的描述似乎支持保留源文件,但这具有误导性:

“在iOS中,当您在后台会话中为文件创建上传任务时,系统会将文件复制到一个临时位置并从那里流式传输数据”

但是它没有说明是否将原始源文件保留在tmp目录中。特别适合您的服务器支持上载部分文件并且您需要在失败后重新启动它们的情况。或者在更常见的情况下,您需要手动重新启动整个失败的上传,例如从可重试的服务器错误中重新启动,或者如果用户杀死了您的应用程序然后重新启动它(iOS不会继续为用户终止的应用程序继续上传)。

在这些情况下,如果您在apps tmp目录中创建文件,则无法指望它仍然存在。文件系统编程指南告诉我们这一点。

https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html

“使用此目录写入不需要在应用程序启动之间保留的临时文件。当不再需要文件时,您的应用程序应从该目录中删除文件;但是,当应用程序被删除时,系统可能会清除该目录没有运行。此目录的内容不由iTunes或iCloud备份。”

因此,当您的应用停止运行时,iOS可以删除任何tmp目录文件,我可以确认在我们的应用的正式发布中已经看到了这一点。如果您认为可能需要再次上传的源文件,则必须将其存储在自己的应用程序目录中,并在完成操作后自行删除。抱歉,需要额外的工作,但是我对此一无所知。