ios - NSURLSession 导致 0B 图像上传到 GCS

标签 ios swift nsurlsession nsurlsessionuploadtask

我正在使用配置为后台 session 的 NSURLSession 将多个图像上传到 GCS 中的存储桶。在一项测试中,使用了 26 张图片,每张大约 10 MB。测试是在强大的 wifi 连接和接近 100% 的电池(如果不主动充电)下进行的。我正在创建这个 NSURLSession 应用程序是后台的,并通过后台任务到期处理程序通知。

NSURLSession 代码:

let config = URLSessionConfiguration.background(withIdentifier: identifier)
config.waitsForConnectivity = true
config.allowsCellularAccess = true
config.isDiscretionary = false

let session = URLSession(configuration: config, delegate: self, delegateQueue: nil)
session.sessionDescription = identifier

创建上传请求:
for (signedGCSURLDestination, image) in images {
  let request = URLRequest(url: signedGCSURLDestination, method: .put)
  request.headers.add(name: "Content-Type", value: "image/jpeg")

  let task = session.uploadTask(with: request, fromFile: file)

  task.taskDescription = identifier
  task.resume()
} 

最终,GCS Bucket 中的图像大小均为 0B。在转换到后台 NSURLSession 之前,我们在应用程序前台使用 Alamofire,这些图像上传到存储桶中就好了。

我开始研究使用后台处理任务在应用程序最小化时可能继续使用 Alamofire 代码,但这是与 NSURLSession 根本不起作用的单独问题。

最佳答案

一旦设备被锁定,正在上传的文件没有适当的权限。设置completeUntilFirstUserAuthentication我要上传的每个文件的属性都解决了这个问题。

FileManager.default.setAttributes([FileAttributeKey.protectionKey: FileProtectionType.completeUntilFirstUserAuthentication],
                                           ofItemAtPath: path)

我想上传是在设备被锁定之前开始的,而且看起来 NSURLSession 上传是并行发生的。因此,所有文件的上传都可能开始了,因此 GCS 中存在 0B 的文件占位符,然后由于文件被锁定,它们从未完成。

关于ios - NSURLSession 导致 0B 图像上传到 GCS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61513090/

相关文章:

ios - 远程通知字符串的本地化会破坏设备设置语言和区域设置 Swift

ios - Swift 子类继承初始值设定项吗?

swift - 防止 NSURLSession 默认 HTTP header

ios - 无法在主线程上处理来自 NSURLSession 的数据

ios - 在 iOS Swift 中动态创建分段控件

ios - 应用程序图标未出现在 ios 的应用程序切换器中

swift - RealmSwift + 多谓词

php - 在 PHP 服务器上签署 .mobileconfig

iOS-在 Google Drive Api 上使用上传图片(错误 "Assertion failure in: GTLServer...")

ios - 如何在 Swift 应用程序中全局设置自定义 header ?