1

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

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

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

4

2 回答 2

0

嗯?您提供整个文件,系统负责管理部分上传/下载,并在传输完成后通知您。在下载的情况下,一旦下载完成,您将获得一个临时文件,您必须将其保存到永久位置。

您根本不应该处理部分文件。

编辑:

您无权访问tmpor /Library/Caches/,除非通过沙箱。您可以通过调用访问缓存目录

[NSSearchPathForDirectoriesInDomains(
  NSCachesDirectory, 
  NSUserDomainMask, YES) lastObject];

据我了解,缓存目录仅在重新启动时被清除,或者如果设备空间严重不足,但我似乎记得文档在何时清除缓存目录时含糊不清。

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

于 2016-05-18T20:59:26.830 回答
0

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

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

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

在这些情况下,如果您在应用程序 tmp 目录中创建该文件,则不能指望该文件仍然存在。文件系统编程指南告诉我们这一点。

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

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

因此,当您的应用程序停止运行时,iOS 可以删除任何 tmp 目录文件,我可以确认我已经在我们的应用程序的生产版本中看到了这一点。如果您认为您可能需要再次上传源文件,则必须将其存储在自己的应用程序目录中,并在完成后自行管理删除它。对不起,额外的工作,但我不知道有什么办法。

于 2018-07-26T01:33:22.177 回答