NSURLSessionUploadTask 会保存临时文件吗

Will temporary files be saved by an NSURLSessionUploadTask

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

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

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

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

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

编辑:

您无权访问 tmp/Library/Caches/,除非通过沙盒。您可以通过调用

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

据我所知,缓存目录只会在重启时被清除,或者如果设备在 space 时变得严重不足,但我似乎记得文档对缓存目录的确切时间含糊不清被清除。

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

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

"In iOS, when you create an upload task for a file in a background session, the system copies that file to a temporary location and streams data from there"

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

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

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

"Use this directory to write temporary files that do not need to persist between launches of your app. Your app should remove files from this directory when they are no longer needed; however, the system may purge this directory when your app is not running. The contents of this directory are not backed up by iTunes or iCloud."

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